从 show segue 返回标题时,UISearchBar 会短暂显示灰色背景
Posted
技术标签:
【中文标题】从 show segue 返回标题时,UISearchBar 会短暂显示灰色背景【英文标题】:UISearchBar briefly displays gray background when returning to title from a show segue 【发布时间】:2017-02-27 04:19:33 【问题描述】:我有一个自定义的UISearchController
和一个自定义的UISearchBar
作为导航控制器的标题,因此在子视图控制器的更改中可以看到一个持久的搜索栏控件,这显示在我的第一张图片中图库(还没有足够的声誉来发布图片):
http://imgur.com/a/IikEw
但是,当用户点击子表视图控制器中显示的搜索结果时,导航标题将替换为文本字符串,因此它看起来像我画廊中的第二张图片。
当我导航回显示搜索结果的表格视图时会出现问题,因为在短时间内,搜索栏的背景是浅灰色的,看起来就像我画廊中的第三张图片。
当我在模拟器中放慢动画速度时,我可以在 Xcode 中进入 Debug View Hierarchy 以查看有问题的元素是什么,结果证明这是一个名为“UISearchBarBackground”的 UIImageView,它只存在直到过渡动画结束,颜色恢复到预期的结果,如我画廊中的第四张图片所示。
在初始化和设置UISearchController
属性的初始视图控制器中,我在viewDidLoad
中设置了搜索栏的以下属性:
let controller = CustomSearchController(searchResultsController: self.searchResultsController)
controller.searchBar.backgroundColor = UIColor.clear
controller.searchBar.backgroundImage = nil
...我有这些自定义类,我实现了这些类,这样我就可以摆脱搜索控制器的取消按钮,它不会被委托语句删除:
class CustomSearchBar: UISearchBar
override func setShowsCancelButton(_ showsCancelButton: Bool, animated: Bool)
super.setShowsCancelButton(false, animated: false)
class CustomSearchController: UISearchController
lazy var _searchBar: CustomSearchBar =
[unowned self] in
let customSearchBar = CustomSearchBar(frame: CGRect.zero)
return customSearchBar
()
override var searchBar: UISearchBar
get
return _searchBar
据我所知,我的自定义搜索控制器在任何时候都没有被取消初始化,它只被初始化一次,所以我觉得问题出现了,因为绘图周期,它暂时放置了一个灰色的可见视图我的设置生效之前的背景。
对于这里到底发生了什么以及如何解决这个问题,我几乎一头雾水。我想知道我是否只是忽略了一些简单的事情,或者我是否必须创建一个自定义转换对象来解决问题。我对 ios 架构和 Swift 的掌握程度约为中级水平,但我一直希望了解更多信息。
【问题讨论】:
将色调颜色设置为 .clear 而不是背景颜色 将controller.searchBar.tintColor
设置为UIColor.clear
或任何其他颜色都没有区别,尽管我似乎可以通过将controller.searchBar.barTintColor
设置为与我的主导航相同的绿色来解决我的问题(设置barTintColor
到 UIColor.clear
在 segue 过渡动画期间导致黑色背景。
【参考方案1】:
我发现这个问题是由于没有为UISearchBar
的可选barTintColor
属性设置值引起的。如果在过渡动画期间属性为nil
,则视图将显示为浅灰色,直到动画结束。为了解决这个问题,我设置了controller.searchBar.barTintColor = UIColor(red: 76/255, green: 203/255, blue: 124/255, alpha: 1)
,现在我得到了预期的结果。
【讨论】:
以上是关于从 show segue 返回标题时,UISearchBar 会短暂显示灰色背景的主要内容,如果未能解决你的问题,请参考以下文章
从 segued View 返回时如何重新加载 iCarousel?
从 iphone 上的 push segue 导航返回时,顶部导航栏变得可见
在 Swift 中使用 UIAlertViewController 时无法从 shouldPerformSegue 返回控制