具有动态变量的自动布局约束?
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];
第二个将采用scrollview
的contentOffset
并将其用作常量。但是,尝试过这个,它只使用约束时存在的偏移量。
当滚动视图滚动时,我希望它让约束更新常量。这样它将继续使用最新的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 啊,是的,滚动无论如何都会触发布局。以上是关于具有动态变量的自动布局约束?的主要内容,如果未能解决你的问题,请参考以下文章