Reputation: 21
I have a search bar that I have applied a drop shadow to, and as you can see here, the cancel button casts its own shadow too. I would like for the shadow to be limited to the search text box. Here is what I'm starting with:
let searchBar = UISearchBar()
searchBar.placeholder = "KAT Milkshake"
searchBar.backgroundImage = UIImage()
searchBar.barTintColor = UIColor.white
searchBar.compatibleSearchTextField.leftView?.tintColor = UIColor.gray
searchBar.compatibleSearchTextField.backgroundColor = UIColor.white
searchBar.layer.shadowColor = UIColor.black.cgColor
searchBar.layer.shadowOpacity = 0.25
searchBar.layer.shadowOffset = CGSize(width: 2, height: 2)
searchBar.layer.shadowRadius = 5
What I've tried:
I tried altering the cancel button's appearance via UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
, but it turns out that this object's shadow is a separate one. Notice the subtle difference around the letters after I applied another shadow by modifying the appearance shadow properties.
Giving the button a white image background didn't work, which I did by accessing searchBar.value(forKey: "cancelButton") as! UIButton
. The shadow is applied around the whole image and looks even worse.
Adjusting the bounds of the search bar layer unfortunately did not work either (
searchBar.layer.frame = CGRect(x: searchBar.frame.minX, y: searchBar.frame.minY, width: searchBar.frame.width - cancelButton.frame.width, height: searchBar.frame.height)
).
I gave the search bar layer a border to observe this, and the cancel button shadow
persists.
I also tried unlinking the cancel button from the superview, but was only able to make it disappear entirely.
Is there any way around this? I'm on Swift 5 and iOS 14.
Upvotes: 1
Views: 855
Reputation: 21
As ibrahimyilmaz suggested, adding the shadow to the UITextField instead of UISearchBar got the job done. Just had to modify my height and layout anchor constraints to handle clipping.
I followed this example by user Joshpy in order to access the text field. For iOS >= 13, making the shadow is as simple as:
searchBar.searchTextField.layer.shadowColor = UIColor.black.cgColor
searchBar.searchTextField.layer.shadowOpacity = 0.25
searchBar.searchTextField.layer.shadowOffset = CGSize(width: 2, height: 2)
searchBar.searchTextField.layer.shadowRadius = 5
Upvotes: 1