Xcode9/Swift4:通过Alpha隐藏NavigationItem上的SearchBar时背景视图仍可见
搞定!SearchBar调Alpha后背景残留的问题解决办法
嘿,我之前也遇到过这个坑——在Xcode 9、Swift 4环境下,滚动TableView时调整navigationBar和searchBar的alpha想做渐隐,结果SearchBar的背景视图死活不跟着消失,太闹心了!
为啥会这样?
你现在的代码只改了searchBar.alpha,但UISearchBar内部有独立的背景视图层级(比如默认的背景图片或者底层的纯色背景视图),这些元素并不会随着searchBar的alpha同步变透明,所以就出现了控件变透明但背景还留在那的情况。
给你几个可行的解决方案:
方案1:同步调整SearchBar内部背景视图的透明度
直接遍历SearchBar的子视图,找到背景相关的视图一起调alpha:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let transp: Float = Float(1 - (mTableView.contentOffset.y / (mTableView.contentSize.height - mTableView.frame.size.height) * 60)) let alphaValue = CGFloat(transp) // 调整导航栏和搜索栏的整体透明度 navigationController?.navigationBar.alpha = alphaValue mSearchController.searchBar.alpha = alphaValue titleMsgView.alpha = alphaValue // 找到SearchBar内部的背景视图,同步调整透明度 guard let searchBarSubviews = mSearchController.searchBar.subviews.first?.subviews else { return } for subview in searchBarSubviews { // 匹配背景图片视图或有背景色的视图 if subview is UIImageView || subview.backgroundColor != nil { subview.alpha = alphaValue } } }
方案2:结合isHidden避免残留(更丝滑)
如果你的需求是滚动到一定阈值后完全隐藏,不如把alpha渐变和isHidden结合起来,彻底解决背景残留:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let transp: Float = Float(1 - (mTableView.contentOffset.y / (mTableView.contentSize.height - mTableView.frame.size.height) * 60)) let alphaValue = CGFloat(transp) navigationController?.navigationBar.alpha = alphaValue mSearchController.searchBar.alpha = alphaValue titleMsgView.alpha = alphaValue // 当透明度接近0时,直接隐藏控件,避免背景残留 let shouldHide = alphaValue <= 0.05 mSearchController.searchBar.isHidden = shouldHide navigationController?.navigationBar.isHidden = shouldHide }
方案3:替换默认背景(最彻底)
直接给SearchBar设置自定义背景,这样就能完全控制它的显示状态:
// 在初始化SearchController的地方设置 mSearchController.searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default) mSearchController.searchBar.backgroundColor = .white // 换成你需要的背景色
之后再调整searchBar的alpha,背景就会跟着一起变透明了。
额外小技巧
如果你只是想实现「滚动时自动隐藏搜索栏」的效果,其实iOS有原生属性,不用自己手动算alpha:
navigationItem.hidesSearchBarWhenScrolling = true
这个原生实现不仅流畅,还不会有背景残留的问题,省心不少!
内容的提问来源于stack exchange,提问作者Oséias Ribeiro
相关产品推荐
相关产品推荐

