开发者社区> 问答> 正文

不同iOS系统中UISearchController的奇怪UI行为

我的应用程序可用于iOS 9或更高版本的设备,我使用UISearchController对于搜索功能,我发现了很多问题,特别是UI问题,我花了很多时间,但仍然有一些问题我无法解决。下面的代码显示了我如何使用searchController在视图控制器中。

if #available(iOS 11, *) {
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
    } else {
        view.addSubview(searchController.searchBar)
        addButton.frame = CGRect(x: 0, y: 0, width: 22, height: 22)
    }

我在子类中配置它,下面是我如何配置它的主要代码。

func configSearchController() {
    definesPresentationContext = true
    searchBar.setImage(R.image.searchBar_search(), for: .search, state: .normal)
    if #available(iOS 11, *) {

    } else {
        searchBar.setBackgroundImage(whiteBgImage, for: .any, barMetrics: .default)
        searchBar.setSearchFieldBackgroundImage(searchFieldBackgroundImage(), for: .normal)
        searchBar.frame = CGRect(x: 0,y: 0,width: UIScreen.main.bounds.width,height: 50)
    }
    var sf : UITextField?
    if #available(iOS 13, *) {
        sf = searchBar.value(forKey: "_searchTextField") as? UITextField
     } else {
        sf = searchBar.value(forKey: "_searchField") as? UITextField
    }
    if let searchField = sf {
        searchField.font = UIFont.systemFont(ofSize: 16)
        searchField.textColor = UIColor.init(red: 49/255.0, green: 58/255.0, blue: 68/255.0, alpha: 1)
        let atrString = NSAttributedString(string: placeHolder ?? "",
                                           attributes: [.foregroundColor : UIColor.init(red: 157/255.0, green: 162/255.0, blue: 166/255.0, alpha: 1),
                                                        .font : UIFont.systemFont(ofSize: 16)])
        searchField.attributedPlaceholder = atrString

        searchField.layer.cornerRadius = 18
        searchField.layer.masksToBounds = true
        searchField.clipsToBounds = true
        let imgView = searchField.leftView as? UIImageView
        var frame = imgView?.frame
        frame?.size.width = 16
        frame?.size.height = 16
        imgView?.frame = frame ?? CGRect.init(x: 0, y: 0, width: 16, height: 16)
    }
    searchBar.setPositionAdjustment(UIOffset.init(horizontal: 10, vertical: 0), for: .search)
    if #available(iOS 9.1, *) {
        obscuresBackgroundDuringPresentation = false
    } else {
        dimsBackgroundDuringPresentation = false
    }
    searchBar.backgroundColor = UIColor.white
}

基于iOS 13和iOS 12的UISearchController以下是调试视图层次结构的屏幕截图。我打印某些ui元素的属性。<UISearchBar: 0x7fcd75c6ff40; frame = (0 44; 375 52),<UISearchBarTextField: 0x7fcd760d8000; frame = (16 1; 343 36)...问题是我不能改变UISearchBar和SearchTextField,我也不能改变我的立场UISearchTextFiled在……里面UISearchBar它总是在顶端。

在iOS 11&12上,在UISearchBar不知道怎么摆脱它。iOS 12搜索栏底线

在iOS 12上,我推一个viewController和searchController,它以奇怪的UI出现,searchController自上而下都有一个动画,所以搜索栏和ViewController之间会有一个空白,直到动画结束。出现带有搜索控制器的iOS 12视图控制器但在iOS 13上,UI被更改,在搜索栏和viewController之间留下一个中断的UI,如下所示iOS 13搜索控制器中断UI

还有其他一些问题,比如在iOS 10上,UISearchBar比iOS 11或更高版本要宽,它的高度不是52,而是44。 我用UISearchController因为它有流畅的动画和良好的封装,但我不知道它在不同的操作系统上有这么多奇怪的行为。谁能告诉我如何解决这些问题,或者我应该放弃,自己定制搜索栏。

展开
收起
游客5akardh5cojhg 2019-12-12 13:50:37 625 0
1 条回答
写回答
取消 提交回答
  • 是时候该用swift ui来做界面了。

    2019-12-12 17:06:41
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载