【问题标题】: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

这可能吗?

【问题讨论】:

    标签: ios objective-c autolayout nslayoutconstraint


    【解决方案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 啊,是的,滚动无论如何都会触发布局。
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多