iOS11中仿iPhone Files应用UISearchController深色模式效果求助
解决UISearchController复现Files应用搜索交互的问题
嘿,我刚好研究过Files应用的这个搜索交互逻辑,给你几个关键的调整步骤,应该能解决你现在整个视图变暗的问题:
关闭系统默认的背景模糊
UISearchController默认的obscuresBackgroundDuringPresentation属性是true,开启后会让整个背景区域自动变暗模糊,这正是你当前遇到的问题。先把这个属性关掉:searchController.obscuresBackgroundDuringPresentation = false手动添加背景遮罩实现变暗效果
既然系统的自动模糊不符合需求,我们可以自己在搜索开始时添加半透明遮罩,模拟Files的效果。通过UISearchBarDelegate的回调来控制遮罩的显示和隐藏:// 搜索开始编辑时添加遮罩 func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { let dimView = UIView(frame: view.bounds) dimView.backgroundColor = UIColor.black.withAlphaComponent(0.5) dimView.tag = 1001 // 标记遮罩视图,方便后续移除 // 把遮罩放在搜索栏下方,确保搜索栏保持白色可见 view.insertSubview(dimView, belowSubview: searchBar) // 添加淡入动画,和原生效果对齐 dimView.alpha = 0 UIView.animate(withDuration: 0.25) { dimView.alpha = 1 } } // 搜索结束时移除遮罩 func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { guard let dimView = view.viewWithTag(1001) else { return } UIView.animate(withDuration: 0.25) { dimView.alpha = 0 } completion: { _ in dimView.removeFromSuperview() } } // 点击取消按钮时结束编辑 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() }确保搜索栏背景为纯白色
有时候搜索栏会自带模糊背景,需要手动设置移除,让它保持纯白:searchController.searchBar.backgroundColor = .white // 移除默认的模糊背景图 searchController.searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)调整展示上下文范围
如果你的控制器是嵌入在导航栏中的,记得设置definesPresentationContext为true,这样搜索栏的展示范围会被限制在当前控制器内,避免影响导航栏的样式:self.definesPresentationContext = true
按照这些步骤调整后,点击搜索栏时就能实现“搜索栏保持白色,其余区域变暗”的Files应用同款效果啦。
内容的提问来源于stack exchange,提问作者Zanclus
相关产品推荐
相关产品推荐

