从 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 设置为与我的主导航相同的绿色来解决我的问题(设置barTintColorUIColor.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 导航返回时,顶部导航栏变得可见

执行 segue swift 4

在 Swift 中使用 UIAlertViewController 时无法从 shouldPerformSegue 返回控制

如何将验证错误从 php 返回到 swift 或 segue 成功

如何从标签栏控制器执行 show segue?