Can the height of the UISearchbar TextField be modified?
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
for subView in searchBars.subviews {
for subsubView in subView.subviews {
if let textField = subsubView as? UITextField {
var bounds: CGRect
bounds = textField.frame
bounds.size.height = 35 //(set height whatever you want)
textField.bounds = bounds
textField.borderStyle = UITextBorderStyle.RoundedRect
// textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
textField.backgroundColor = UIColor.redColor()
// textField.font = UIFont.systemFontOfSize(20)
}
}
}
}
This might helps you :)
This is the correct Swift 4.0 answer on how to change the height of a UISearchBar:
let image = getImageWithColor(color: UIColor.clear, size: CGSize(width: 1, height: 40))
searchBar.setSearchFieldBackgroundImage(image, for: .normal)
Using following method:
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
Tested on 4th. June. 2018
Based on thelearner's answer here's the code for Swift 5.* :
extension UISearchBar {
func updateHeight(height: CGFloat, radius: CGFloat = 8.0) {
let image: UIImage? = UIImage.imageWithColor(color: UIColor.clear, size: CGSize(width: 1, height: height))
setSearchFieldBackgroundImage(image, for: .normal)
for subview in self.subviews {
for subSubViews in subview.subviews {
if #available(iOS 13.0, *) {
for child in subSubViews.subviews {
if let textField = child as? UISearchTextField {
textField.layer.cornerRadius = radius
textField.clipsToBounds = true
}
}
continue
}
if let textField = subSubViews as? UITextField {
textField.layer.cornerRadius = radius
textField.clipsToBounds = true
}
}
}
}
}
private extension UIImage {
static func imageWithColor(color: UIColor, size: CGSize) -> UIImage? {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
guard let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() else {
return nil
}
UIGraphicsEndImageContext()
return image
}
}
and here's how we can apply it:
searchBar?.updateHeight(height: 48)
and here's the result:
If you use :
func setSearchFieldBackgroundImage(backgroundImage: UIImage?, forState state: UIControlState)
The height of UISearchBar's UITextfield would be the same as the height of the Image.
You can drop in an Image,use it to customize UISearchBar's UITextfield height and backgroundImage.
Or you can use the function below to create a round corner UIImage:
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRectMake(0, 0, size.width, size.height)
let path = UIBezierPath(roundedRect: rect, cornerRadius: 5.0)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
path.fill()
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
The Width of the UIImage is ignored.But to have a corner radius ,it's better bigger than 10.0
.
The code would be look like this:
let image = self.getImageWithColor(UIColor.lightGrayColor(), size: CGSizeMake(20, 20))
searchBar.setSearchFieldBackgroundImage(image, forState: .Normal)