具有动态变量的自动布局约束?

Posted

技术标签:

【中文标题】具有动态变量的自动布局约束?【英文标题】:Auto Layout Constraint With Dynamic Variable? 【发布时间】:2014-12-01 12:20:02 【问题描述】:

是否可以有一个带有动态常量/乘数的自动布局约束 (NSLayoutConstraint)?

例如,这将是一个沼泽标准NSLayoutConstraint

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0];

那么这里将是该约束的更改,而是常量中的一个动态变量:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:scrollView.contentOffset.x];

第二个将采用scrollviewcontentOffset 并将其用作常量。但是,尝试过这个,它只使用约束时存在的偏移量。

当滚动视图滚动时,我希望它让约束更新常量。这样它将继续使用最新的contentOffset

这可能吗?

【问题讨论】:

【参考方案1】:

肯定是的。

事实上,这就是它们的目的。当您为视图等设置动画时......您需要能够更改约束。

与直觉相反,NSLayoutConstraint 的唯一可写属性是 constant 属性。 (笑)

不过,您的代码并不完全正确。

创建约束首先要为它创建一个属性...

@property (nonatomic, strong) NSLayoutConstraint *leftConstraint;

然后创建它...

self.leftConstraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0];

然后编辑已经存在的约束...

self.leftConstraint.constant = scrollView.contentOffset.x;

然后你需要强制视图重新布局子视图...

[self.view layoutIfNeeded];

【讨论】:

感谢 Fogmeister。这很好用,虽然我不需要打电话给layoutIfNeeded,但没有这个也可以。 @JoshKahane 好的,很高兴你让它工作了。有时可能需要它。例如,动画约束需要更改动画块OUTSIDE的约束,然后调用layoutIfNeeded inside。这似乎违反直觉(今天的关键字),所以如果您认为某些东西不起作用,请注意它。 很酷,谢谢。我认为我可能不需要调用它的原因是因为我正在更新scrollViewDidScroll 中的常量,因此它的更新频率足以需要动画。 @JoshKahane 啊,是的,滚动无论如何都会触发布局。

以上是关于具有动态变量的自动布局约束?的主要内容,如果未能解决你的问题,请参考以下文章

具有动态大小的ios自动布局

具有动态视图数量和自动布局 iOS6 的 UIScrollView

具有动态指定视图之间间距的自动布局

具有动态大小的单元格的复杂自动布局

内容拥抱和内容压缩阻力、自动布局约束的问题

具有自动布局的 UITableviewCell 约束失败