Swift 4中通过Alpha随垂直滚动隐藏SearchBar的实现问题(Xcode 9)
我明白你现在的困扰——调整searchBar.alpha的时候,总感觉有个背景残留着,没法完全实现滚动隐藏的效果对吧?这是因为UISearchBar内部默认有个背景视图,光改alpha没法彻底隐藏它。下面给你几个实用的解决方法:
方法1:移除SearchBar的默认背景视图
先写个小扩展来清理SearchBar的背景元素,这样后续调整alpha就能完全生效了:
extension UISearchBar { func clearBackground() { // 遍历SearchBar的子视图,找到背景相关的控件并隐藏 guard let subviews = self.subviews.first?.subviews else { return } for view in subviews { // 覆盖默认的图片背景和颜色背景 if view is UIImageView || view.backgroundColor != nil { view.isHidden = true view.alpha = 0 } } } }
然后在viewDidLoad里调用这个方法:
override func viewDidLoad() { super.viewDidLoad() // 初始化你的mSearchController之后 mSearchController.searchBar.clearBackground() }
这样处理后,再调整searchBar.alpha就不会有背景残留了。
方法2:滚动时同时调整Alpha和Frame(彻底滑出屏幕)
如果想要更丝滑的隐藏效果,除了调整透明度,还可以让SearchBar随着滚动向上移出屏幕:
func scrollViewDidScroll(_ scrollView: UIScrollView) { // 计算透明度,限制在0-1之间,避免出现异常值 let scrollOffset = self.mTableView.contentOffset.y let transp = max(0.0, min(1.0, 1 - (scrollOffset / 60))) self.navigationController!.navigationBar.alpha = transp self.mSearchController.searchBar.alpha = transp // 调整SearchBar的Y坐标,让它随滚动向上移动 let searchBarFrame = self.mSearchController.searchBar.frame self.mSearchController.searchBar.frame = CGRect( x: searchBarFrame.origin.x, y: -searchBarFrame.size.height * (1 - transp), width: searchBarFrame.size.width, height: searchBarFrame.size.height ) }
我给你的透明度计算加了范围限制,防止滚动过度时出现负数或者超过1的透明度,这样效果会更稳定。
方法3:利用SearchController的内置属性(适合特定场景)
如果你的SearchController是嵌入导航栏使用的,可以试试开启这个属性,它会在搜索激活时自动处理导航栏和搜索栏的显示:
mSearchController.hidesNavigationBarDuringPresentation = true
不过这个主要是针对搜索激活的场景,和你滚动时隐藏的需求可能不完全匹配,但可以作为辅助优化项。
内容的提问来源于stack exchange,提问作者Oséias Ribeiro
相关产品推荐
相关产品推荐

