【问题标题】:Why is my UISearchBar's width 0 after becoming first responder?为什么成为第一响应者后我的 UISearchBar 的宽度为 0?
【发布时间】:2016-12-20 16:24:19
【问题描述】:

我的 UIStackView 中有一个带有按钮的 UISearchBar,它是一种导航栏。这是它通常的样子: 但是当它成为第一响应者时,UISearchBar 的宽度变为 0,它看起来像这样:

现在我唯一的限制是右侧 UIButton 的宽度为 44pt,并且整个堆栈视图固定在屏幕的顶部和侧面。这是控制台打印的内容:

我对@9​​87654329@ 不是很流利,但显然有些东西与按钮上的 44pt 宽度限制相冲突。为什么UISearchbar的宽度变成0了?

这是我的代码:

override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
    if presentationStyle == .expanded {
        searchController.searchBar.becomeFirstResponder()
        searchController.searchBar.tintColor = UIColor.white
    }
}

func didDismissSearchController(_ searchController: UISearchController) {
    requestPresentationStyle(.compact)
}

override func viewDidLoad() {
    super.viewDidLoad()
    configureSearchController()
}

func configureSearchController() {
    searchController = UISearchController(searchResultsController: nil)
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search here..."
    searchController.searchBar.sizeToFit()
    searchController.searchBar.isTranslucent = false
    searchController.searchBar.delegate = self
    searchController.delegate = self
    searchController.searchBar.barTintColor = addButton.backgroundColor
    stackView.insertArrangedSubview(searchController.searchBar, at: 0)
    //This removes the hairline
    let color = addButton.backgroundColor
    searchController.searchBar.layer.borderWidth = 1
    searchController.searchBar.layer.borderColor = color?.cgColor

}

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    if presentationStyle == .expanded {
        return true
    } else {
        requestPresentationStyle(.expanded)
        return false
    }
}

我的故事板按要求:

【问题讨论】:

  • 您应该完整地发布日志(缺少说明系统破坏了哪些约束的部分)。另外,将日志发布为文本(即代码)。
  • 整个堆栈视图固定在屏幕的顶部和侧面--好的,但这并不能完全限制堆栈视图。底部呢?
  • 另外,你为什么要发布输出的图像?您无法使用 Mac 的复制/粘贴功能吗?另一方面,如果能看到您的故事板目录的图像,那就太好了。
  • 堆栈溢出不会让我粘贴,因为它将标签解释为 HTML 代码(我认为)。
  • 堆栈视图有 44pt 高度限制

标签: ios swift autolayout uisearchbar nslayoutconstraint


【解决方案1】:

我对 NSLayoutConstraint 不是很流利,但显然有些东西与按钮上的 44pt 宽度约束相冲突。为什么UISearchbar的宽度变成0了?

您的输出中显然存在对按钮前缘的限制——但您说您只限制了按钮的宽度。输出表明您将按钮的前沿限制在堆栈视图的前沿。

如果按钮位于搜索栏的左侧,您当然可以将按钮的前沿限制在堆栈视图的前沿并使按钮宽 44。但是,由于该按钮位于搜索栏的右侧,因此该按钮可以是 44 宽,也可以限制在堆栈视图的前沿——但不能同时使用这两者。

因此,iOS 打破了 44 宽度限制,并将按钮一直向左延伸,使其与堆栈视图的前沿对齐。

结果不一定是这样。我想Apple可以对Xcode进行编程以忽略您拖动按钮的位置并仅遵守约束,即移动按钮使其前缘和堆栈视图的前缘对齐,并为按钮提供44的宽度,因此将搜索栏移动到按钮的右侧。但是,很明显,Apple 在水平堆栈视图中对项目的排序给予了更高的优先级,也就是说,因为您将按钮放在搜索栏的右侧,所以它仍然存在。

【讨论】:

  • 按钮没有前导约束。另外,为什么只有在触发第一响应者时才会出错?
  • 我是这样设置的:我无法在情节提要中表示 UISearchController 的搜索栏,所以我必须以编程方式添加它。所以我的按钮的宽度限制为 44,但堆栈视图设置为填充。所以是的,在故事板中存在相互冲突的约束。但是当我在代码中将 UISearchBar 添加到堆栈视图时,这个冲突就解决了。结果是图 1。但是由于某种原因,当搜索栏成为第一响应者时(在图 2 中),它的宽度变为 0,然后我们就有了冲突的约束。如果搜索栏大小合适,就不会有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多