约束不会在ios中自动更新

时间:2016-10-24 13:06:05

标签: ios autolayout nslayoutconstraint

我在图片中创建了一个故事板。在那里我设置了红色视图和tableView之间的垂直间距是20左右。它工作得很好。 enter image description here

但是当我试图改变红色视图的高度时,tableview应该会出现我添加的约束,但是表格视图在同一个地方保持不变。

我使用了以下代码

redView.frame.size = CGSize(width: 1008, height: 0)
self.view.layoutIfNeeded()

5 个答案:

答案 0 :(得分:1)

每当您向故事板上的任何对象添加约束时,那么该对象的帧将由autolayout引擎维护。这是我猜的主要设计原则。在这种情况下,您可以简单地做的是只需要更新所需约束的出口,并在代码中更新该约束。为了您的理解,我附上了截图。

enter image description here

现在制作约束出口后,它必须如下所示。

@IBOutlet weak var containerViewHeight: NSLayoutConstraint!

现在要更新高度,你只需做一件事。

containerViewHeight.constant = 0

在我看来,如果此更新在viewDidLoadviewWillAppear内无效,请在viewDidLayoutSubviews内更新,因为当viewDidLoad被调用时,iOS不适用布局得当。

就我而言,我要做的是 -

override func viewDidLayoutSubviews() { //This ensures all the layout has been applied properly.
    super.viewDidLayoutSubviews()
    containerViewHeight.constant = 0
}

注意: - 要在布局更改期间实现一些不错的动画效果,您可以在UIView动画块中应用此约束更新,如下所示。但是请记住,要很好地看到效果,你必须在viewDidAppear等之后正确呈现视图后调用它。

UIView.animateWithDuration(1.0, delay: 0.2, usingSpringWithDamping: 8.0, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.CurveEaseIn, animations: {
    containerViewHeight.constant = 0
    self.view.layoutIfNeeded()
}, completion: nil)

对不起任何错误。 欢迎更新/编辑。

希望这有帮助。感谢

答案 1 :(得分:0)

您应该使用Autolayout来操纵redView的高度。修改其框架的大小不是Autolayout。修改其高度约束(如果存在)

答案 2 :(得分:0)

您需要使用约束或更改帧!你不能两个都做!

您需要做的是对您的约束进行插座引用并改为改变其常量值。

答案 3 :(得分:0)

如果您将代码放在viewdidload或viewwillappear中,您会发现这样的问题。在加载所有约束之后,您需要放置代码。

此外,制作高度约束的对象并将其命名为例如redViewHeight。 并通过以下方式更改其值:redViewHeight.constant = 0

它会起作用!

答案 4 :(得分:0)

使用以下内容替换视图的约束。

  1. Redview

    Top constraint to ParentView
    Leading Constraint to ParentView
    Trailing constraint to ParentView
    Height Constraint

  2. 的TableView

    Top constraint to RedView
    Leading Constraint to ParentView
    Trailing constraint to ParentView
    Bottom constraint to ParentView

  3. 现在为RedView的HeightConstraint连接IBOutlet并修改其constant值。 UITableView会根据需要调整其高度。