iOS:UINavigationController 的交互式弹出手势期间导航栏的全宽自定义 titleView 闪烁

问题描述 投票:0回答:3
我想为我的导航控制器使用自定义的 titleView ,它占据导航栏中的可用宽度。为了实现此目的,我使用带有 UIView.layoutFittingExpandedSize 的自定义视图,因为它是内在内容大小。 但由于这个layoutFittingExpandedSize,标题视图在 UINavigationController 的交互式弹出手势期间闪烁。 (请参阅随附的 GIF:

https://ibb.co/98hC3rc

注意:我有一个默认的导航后栏按钮和一个自定义的右栏按钮项目。

    如果标题视图具有固定宽度,则可以修复此问题。但是计算导航栏中标题视图的可用空间是不可能的。
  • 我也尝试过在视图控制器生命周期方法中切换
  • translatesAutoresizingMaskIntoConstraints
     标志,但它不起作用。
class ProfileVC: UIViewController { override func viewWillAppear(_ animated: Bool) { let searchBox = SearchView(frame: .zero) self.navigationItem.titleView = searchBox self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: nil, action: nil) } } class SearchView: UIView { override var intrinsicContentSize: CGSize { return UIView.layoutFittingExpandedSize } }

有人能帮我解决这个标题视图闪烁的问题吗? 预先感谢!

ios swift uinavigationcontroller
3个回答
1
投票
最终我找到了解决方案。 交互式弹出手势从

viewWillDisappear:

 开始,到 
viewWillAppear:
 结束。
步骤1:交互开始时(即在
translatesAutoresizingMaskIntoConstraints
中)打开导航标题视图的
viewWillDisappear:
,使标题视图的宽度和位置保持不变。
步骤 2:当交互停止时(即在 
translatesAutoresizingMaskIntoConstraints
 中)关闭导航标题视图的 
viewWillAppear:
,以便现有约束将按原样工作。


0
投票
是什么阻止您使用自动布局?您可以监听

titleView

 何时添加到超级视图,然后设置约束(尽管确保只执行一次)。


0
投票
我有同样的问题,所以解决方案是:

  1. 为 TitleView 创建您自己的类(您已经拥有它:

    class SearchView: UIView {}

  2. 覆盖

    intrinsicContentSize

    (您可能依赖于
    UIView.layoutFittingExpandedSize
    ,但也可以
    例如,在 iOS 15 和 iOS 16 上不同,然后具有相同的
    您将需要依赖左/右页边距 
    UIScreen.main.bounds
    。)

  3. 在拥有

    SearchTitleView

     的 ViewController 中,您需要将自定义 
    translatesAutoresizingMaskIntoConstraints
    searchTitleView
     设置为 true/false,以防止跳转和重叠导航栏按钮项目,如下所示:

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) searchTitleView.translatesAutoresizingMaskIntoConstraints = false } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) searchTitleView.translatesAutoresizingMaskIntoConstraints = true }

最后,如果没有你和我的问题,它看起来会更好。

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