Ios 当从显示序列返回到标题时,UISearchBar会短暂显示灰色背景
我有一个自定义的Ios 当从显示序列返回到标题时,UISearchBar会短暂显示灰色背景,ios,swift,segue,uisearchbar,uisearchcontroller,Ios,Swift,Segue,Uisearchbar,Uisearchcontroller,我有一个自定义的UISearchController,带有一个自定义的UISearchBar作为导航控制器的标题,这样在子视图控制器的整个更改过程中都可以看到一个持久的搜索栏控件,它显示在我的图库的第一张图像中(声誉还不足以发布图像): 但是,当用户点击子表视图控制器中显示的搜索结果时,导航标题将替换为文本字符串,因此它看起来像“我的图库”中的第二个图像 当我导航回显示搜索结果的表视图时,问题就出现了,因为在很短的一段时间内,搜索栏有一个浅灰色的背景,看起来像我图库中的第三幅图像 当我在模拟器
UISearchController
,带有一个自定义的UISearchBar
作为导航控制器的标题,这样在子视图控制器的整个更改过程中都可以看到一个持久的搜索栏控件,它显示在我的图库的第一张图像中(声誉还不足以发布图像):
但是,当用户点击子表视图控制器中显示的搜索结果时,导航标题将替换为文本字符串,因此它看起来像“我的图库”中的第二个图像
当我导航回显示搜索结果的表视图时,问题就出现了,因为在很短的一段时间内,搜索栏有一个浅灰色的背景,看起来像我图库中的第三幅图像
当我在模拟器中减慢动画的速度时,我可以进入Xcode中的调试视图层次结构,查看有问题的元素是什么,结果是一个名为“UISearchBarBackground”的UIImageView,它只存在到过渡动画结束,并且颜色捕捉回预期结果,如我的图库中的第四张图片所示
在初始化和设置myUISearchController
属性的初始视图控制器中,我在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的了解处于中级水平,但我一直希望了解更多。我发现这个问题是由于没有将值设置为
UISearchBar
的可选BartinColor
属性造成的。如果在过渡动画期间属性为nil
,则视图将显示为浅灰色,直到动画结束。为了解决这个问题,我设置了controller.searchBar.bartincolor=UIColor(红色:76/255,绿色:203/255,蓝色:124/255,alpha:1),现在我得到了预期的结果。将淡色设置为.clear而不是背景色设置controller.searchBar.tintColor
设置为UIColor.clear
或任何其他颜色都没有区别,尽管通过将controller.searchBar.bartincolor
设置为与主导航相同的绿色(将bartincolor
设置为UIColor),我似乎能够解决问题。清除会在分段过渡动画期间产生黑色背景。