Swift 4 - iOS 11 搜索栏范围不会按应有的方式显示

问题描述 投票:0回答:4

我有一个应用程序,在 iOS 10 上运行良好且没有任何问题,但在 iOS 11 和 Xcode Beta 5 上,我遇到了搜索栏范围的奇怪问题,其中范围栏似乎是从底部切掉的。 (所有版本的 Xcode beta 和 iOS 11 都是如此)如果有人能引导我走向正确的方向,我真的很高兴。谢谢

在上面您可以看到当我按下汉堡菜单按钮时所看到的内容。这里没问题.. 搜索栏还有一个范围栏,单击时会显示。我没有将其设置为以编程方式显示。但我想这是设置范围按钮标题时的默认行为。

问题:

当我单击搜索栏输入信息时,我会看到上面的屏幕。在 iOS 10 上我没有遇到任何问题。但现在,使用 iOS 11,无论我做什么,我都无法使其像在 iOS 10 上一样工作。搜索范围栏显示就像从底部切掉一样。

这就是它在 iOS 10 中的显示方式,我希望它在 iOS 11 中也是如此。

屏幕的故事板视图

我将相关代码粘贴在这里。

    class SlideMenuViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UIGestureRecognizerDelegate{

     let searchController = UISearchController(searchResultsController: nil)

    @IBOutlet var sview: UIView!

    @IBOutlet var tableView: UITableView!



override func viewWillAppear(_ animated: Bool) {
//some non relevant code before this

 if sview.subviews .contains(searchController.searchBar) {
            print("Already contains")


        } else {

            sview.addSubview(searchController.searchBar)
            print(searchController.searchBar.showsScopeBar)

            searchController.searchBar.sizeToFit()
            searchController.searchBar.frame.size.width = view.frame.size.width



          searchController.searchBar.barTintColor = searchBarTintColor

            searchController.searchBar.tintColor = searchTintColor
        }



    }


override func viewDidLoad() {

//some other code

searchController.searchBar.delegate = self

searchController.searchBar.scopeButtonTitles = [NSLocalizedString("İsimlerde", comment: ""), NSLocalizedString("Açıklamalarda", comment: "")]

        searchController.searchBar.returnKeyType = UIReturnKeyType.done

searchController.searchResultsUpdater = self

        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true

//some other code

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

     if searchController.isActive && searchController.searchBar.text != "" {

        switch scpglobal {
            case NSLocalizedString("İsimlerde", comment: ""):
                return filteredIsimler.count

            case NSLocalizedString("Açıklamalarda", comment: ""):
                return filteredAciklamalar.count

            default:
                print("Tableview default")
        }

        }



        return isimlerArray.count
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

//some code about search here but nothing that will result in that behaviour

}

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        print("cancel")
        searchController.searchBar.text = ""

    }


func updateSearchResults(for searchController: UISearchController) {


        let searchBar = searchController.searchBar



        let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
        filterContentForSearchText(searchText: searchController.searchBar.text!, scope: scope)
        tableView.reloadData()
    }

}


extension SlideMenuViewController:UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        filterContentForSearchText(searchText: searchController.searchBar.text!, scope: searchController.searchBar.scopeButtonTitles![selectedScope])
    }
}

编辑:如果我向搜索栏添加约束,就会发生这种情况。首先一切看起来都很好。

然后,当您单击搜索栏时,就会发生这种情况..搜索栏移出屏幕。看箭头。

但是如果你关闭滑动菜单并重新打开它

一切正常,直到您单击取消按钮。之后,您必须再次执行所有这些操作才能看到搜索栏正常工作。

约束代码

 searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false
 sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .top, relatedBy: .equal, toItem: sview, attribute: .top, multiplier: 1, constant: 0))
 sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .bottom, relatedBy: .equal, toItem: sview, attribute:.bottom, multiplier: 1, constant: 0))

 sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .leading, relatedBy: .equal, toItem: sview, attribute: .leading,multiplier: 1, constant: 0))
 sview.addConstraint(NSLayoutConstraint(item: searchController.searchBar, attribute: .trailing, relatedBy: .equal, toItem: sview, attribute: .trailing, multiplier: 1, constant: 0))
ios uisearchbar swift4
4个回答
14
投票

查看WWDC 2017 视频

你应该这样做:

if #available(iOS 11.0, *) {
    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
} else {
    tableView.tableHeaderView = searchController.searchBar
}

然后进行相应的更改。


4
投票

我能够通过将

searchController
替换为自定义
searchBar
来解决该问题。

let searchBar = UISearchBar(frame:CGRect(x: 0, y: 0, width: 266, height: 100))

但要小心,不要忘记使用

searchBar.sizeToFit 

searchBarShouldBeginEditing
searchBarShouldEndEditing
里面,否则你可能会遇到奇怪的 UI 问题,特别是当你使用

searchBar.showsScopeBar = true

因此,如果您遇到类似的问题,请摆脱

searchController
并实现
searchBar
及其委托方法。它不会为您提供相同的范围栏动画,但至少它可以工作。此方法的另一个缺点是,如果您有
searchBar.isTranslucent = true
,您可能会在搜索栏中看到另一个范围栏的幽灵。所以请确保

searchBar.isTranslucent = false

如果有人想出更好的方法来解决这个问题,我洗耳恭听......

代理设置示例

 func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsScopeBar = true
    searchBar.sizeToFit()
    searchBar.setShowsCancelButton(true, animated: true)
    return true
}

func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsScopeBar = false
    searchBar.sizeToFit()
    searchBar.setShowsCancelButton(false, animated: true)
    return true
}

1
投票

这可能会解决您的问题:

func searchDisplayController(_ controller: UISearchController, willShowSearchResultsTableView tableView: UITableView)
 {
    tableView.backgroundColor = self.tableView.backgroundColor
    tableView.rowHeight = self.tableView.rowHeight
    tableView.tableFooterView = UIView()
}

0
投票

当我的 iOS 更新到最新版本时,我也遇到了类似的问题。激活搜索栏时,我的范围栏没有显示。

我的解决方案是在我的配置方法中添加以下代码:

private func configSearchControll() {
  let sc =  UISearchController(searchResultsController: nil)
  // config search controller
  if #available(iOS 16.0, *) {
        sc.scopeBarActivation = .onSearchActivation
    } else {
        if #available(iOS 13.0, *) {
            sc.automaticallyShowsScopeBar = true
        } else {
            // Fallback on earlier versions
        }
    }
}

通过上述更改,我的范围项目显示在激活搜索栏的焦点上。

在我的视图控制器的

viewDidLoad
事件中

override func viewDidLoad() {
  super.viewDidLoad()
  // configuration for the view 
  DispatchQueue.main.async {
        [weak self] in
        guard let this = self else { return }
        this.configSearchController()
    }
}

参考:Apple 开发者

© www.soinside.com 2019 - 2024. All rights reserved.