每次加载视图时只能调用一次 layoutIfNeeded - 例如视图加载?

Posted

技术标签:

【中文标题】每次加载视图时只能调用一次 layoutIfNeeded - 例如视图加载?【英文标题】:Can layoutIfNeeded be called only once per loading the view - e.g. viewDidLoad? 【发布时间】:2020-02-17 14:13:01 【问题描述】:

当用户与应用程序交互时,我的视图控制器中的视图高度需要改变。有时视图需要更大的高度,而有时它需要更短,具体取决于用户拥有的选项数量。

我已经实现了一个根据视图状态改变高度的方法,我在viewDidLoad中调用这个方法来设置初始状态,每当状态改变时我都会调用这个方法。

然而,视图真正更新布局的唯一一次是来自viewDidLoad 中的调用。我的方法的所有其他调用都不会更新视图。

func updateContainerViewHeight(constant: CGFloat) 
    print("lets update")
    baseView.heightAnchor.constraint(equalToConstant: constant).isActive = true
    containerView.heightAnchor.constraint(equalToConstant: constant).isActive = true
    self.view.setNeedsLayout()

    UIView.animate(withDuration: 0.25) 
        self.view.layoutIfNeeded()
    

仅供参考print("let's update") 正在控制台中打印。

【问题讨论】:

如果您没有看到任何变化,那么您很可能存在其他冲突的约束。例如。你有旧的身高限制吗?如果是这样,请创建这些约束的出口并更新它们各自的 constant 值。 顺便说一下,不需要调用setNeedsLayout 【参考方案1】:

在这里

baseView.heightAnchor.constraint(equalToConstant: constant).isActive = true
containerView.heightAnchor.constraint(equalToConstant: constant).isActive = true

每次调用都会添加新的约束,这会导致冲突,所以创建

1-

var baseCon,containCon:NSLayoutConstraint!

2-

baseCon = baseView.heightAnchor.constraint(equalToConstant: constant)
baseCon.isActive = true
containCon = containerView.heightAnchor.constraint(equalToConstant: constant)
containCo.isActive = true

3- 然后玩常量

baseCon.constant = ////

【讨论】:

以上是关于每次加载视图时只能调用一次 layoutIfNeeded - 例如视图加载?的主要内容,如果未能解决你的问题,请参考以下文章

从 UInavigationcontroller 呈现视图控制器后,不调用 ios 10 加载视图和 viewwillappear

如何在uitableview中加载数据而不每次都重新加载

如何为具有不同公式的多个 glm 调用仅加载一次数据?

为啥我的 TabBar 按钮在我第一次加载视图控制器时被禁用?

多次重新加载 TableView Swift

iOS:相机在第一次加载视图控制器时无法识别二维码