gpt4 book ai didi

ios - 删除大标题 UINavigationBar 中 UISearchController 顶部的 1px 行

转载 作者:可可西里 更新时间:2023-11-01 03:10:43 26 4
gpt4 key购买 nike

我正在从具有大型样式 UINavigationItem 的 View 转换为具有大型样式 UINavigationItemUISearchController 的 View 。我自定义了 UINavigationBar 的背景颜色。

由于某种原因,UINavigationBarUISearchController 之间有一个 1px 的线或空格。我可以从 NavigationBar 看出它,因为如果我滚动以使搜索栏停留在顶部,该行就会消失。我只是不确定是什么产生了这条线。除了设置 barTintColortintColor 之外,我没有使用阴影或任何花哨的东西。如果我不使用大样式标题,我会看到这条线,但只有在 View 之间转换时才会看到。这就像在转换 UISearchController 时并没有正确地粘在 UINavigationBar 上。

如果您能帮助我们找出这条线的来源,我们将不胜感激。

更新:经过进一步调查,这似乎仅在 navigationItem.hidesSearchBarWhenScrolling 设置为 false 时才会发生。如果它最初是隐藏的,那么前一个 View 的动画是平滑的,并且显示条形图也是平滑的。

Example screenshot of line

最佳答案

测试您描述的导航项和搜索栏设置,我只能在过渡动画期间重现 1px/point 线。

解决方法:这一行实际上是背景布局 View (forLastBaselineLayout),由UINavigationBar 使用,最终可见由于 UISearchBar 的错误框架。设置其背景以匹配您的导航栏颜色以将其隐藏在后站点

// MARK: UINavigationControllerDelegate

public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationController?.navigationBar
.forLastBaselineLayout.backgroundColor = .red // TODO:
}

确保将实现 UINavigationControllerDelegate 的对象设置为 navigationController.delegate 以接收上述委托(delegate)调用。

此外(不是问题的一部分): UISearchBar 在 Controller 之间转换(推送和弹出)时似乎表现得很奇怪,尤其是当一个 Controller 具有/显示 searchBar 但不是另一个。 解决方法,我发现暂时隐藏显示 Controller 的搜索栏在视觉上更令人愉悦。这是我使用的代码:

public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if let sender = navigationStack.popLast() {
prepareSearchBarForTransition(from: sender)
}
navigationStack = navigationController.children
}

/// Set only from `navigationController: willShow`
private var navigationStack: [UIViewController] = []

func prepareSearchBarForTransition(from sender: UIViewController) {
if #available(iOS 11.0, *) {
let searchController = sender.navigationItem.searchController
sender.navigationItem.searchController = nil
weak var weakSender = sender
let navigationTransitionDuration: TimeInterval = 0.33
DispatchQueue.main.asyncAfter(deadline: .now() + navigationTransitionDuration) {
/// Reset the search bar.
weakSender?.navigationItem.searchController = searchController
}
} else {
// TODO: Check if the above workaround is neccessary for < iOS 11
}
}

关于ios - 删除大标题 UINavigationBar 中 UISearchController 顶部的 1px 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52346812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com