【问题标题】:NavigationItem TitleView constraint not workingNavigationItem TitleView 约束不起作用
【发布时间】:2018-10-01 02:22:39
【问题描述】:

我想使用 UITextField 创建一个搜索栏。我尝试将 NavigationItem 的 TitleView 设置为文本字段并设置相应的约束。但是导航栏中心的文本字段仍然很短。如何使文本字段填满整个导航栏?这是我的代码:

cancelbtn = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(CourseTableViewController.searchCancelled))
self.navigationItem.leftBarButtonItem = cancelbtn

let searchField = UITextField()
searchField.translatesAutoresizingMaskIntoConstraints = false
searchField.borderStyle = .roundedRect
self.navigationItem.titleView = searchField
self.navigationItem.titleView!.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: cancelbtn.width)
self.navigationItem.titleView!.widthAnchor.constraint(equalToConstant: view.frame.size.width - cancelbtn.width)

它的外观是这样的: UIView

【问题讨论】:

  • 你可能想研究一下使用 UISearchController。
  • 我想使用 UITextField,因为它具有 textFieldShouldReturn 之类的功能,这对我的应用程序至关重要。除了左侧的取消按钮之外,是否有增加文本字段以占据整个导航栏?
  • UISearchController 有一个 UISearchBar。 UISearchBarDelegate 与 UITextFieldDelegate 有大部分相同的方法。

标签: swift uitextfield uinavigationbar swift4.2 titleview


【解决方案1】:

您应该阅读 Apple 的相关指南。从 iOS11 开始,您应该将 searchBar 安装到 navigationItem 中。尝试使用此代码:

import UIKit

class ViewController: UIViewController, UISearchControllerDelegate {

var searchController = UISearchController()

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = false
    searchController = UISearchController(searchResultsController: nil)
    searchController.delegate = self

    // Customisation 
    searchController.searchBar.tintColor = .black
    searchController.dimsBackgroundDuringPresentation = false

    navigationItem.searchController = searchController
    navigationItem.hidesSearchBarWhenScrolling = false
}

}

【讨论】:

  • 我想实现一个 Quora 风格的搜索栏。左侧的按钮允许用户返回上一个视图,按钮右侧是允许用户搜索的文本字段。搜索控制器无法集成返回按钮。
【解决方案2】:

我解决了我的问题。我没有使用titleView,而是将文本字段放在右侧的barButtonItem 中,并将其宽度设置为view.frame.size.width。这给了我一个占据整个导航的文本字段。我在这里附上了代码,以防有人也想这样做。

searchBar = UISearchBar()
searchBar.showsCancelButton = false
searchBar.placeholder = "Course name"
searchBar.delegate = self
cancelbtn = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(CourseTableViewController.searchCancelled))
self.navigationItem.leftBarButtonItem = cancelbtn

searchTextField = UITextField()
searchTextField.borderStyle = .roundedRect
searchTextField.widthAnchor.constraint(equalToConstant: view.frame.size.width - cancelbtn.width)
searchTextField.translatesAutoresizingMaskIntoConstraints = false
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: searchTextField)
self.navigationItem.rightBarButtonItem?.width = view.frame.size.width

【讨论】:

    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2018-12-30
    • 2015-03-13
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多