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

Jos*_*ane 3 objective-c ios autolayout nslayoutconstraint

是否可以NSLayoutConstraint使用动态常量/乘数的自动布局约束()?

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

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
Run Code Online (Sandbox Code Playgroud)

那么这里将是对约束的改变,但是常量中的动态变量:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:scrollView.contentOffset.x];
Run Code Online (Sandbox Code Playgroud)

第二个将采取contentOffsetscrollview,并以此为常数.但是,尝试过这个,它只使用约束时存在的偏移量.

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

这可能吗?谢谢.

Fog*_*ter 6

当然是.

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

反直觉地说,唯一的属性NSLayoutConstraint是可写的constant属性.(大声笑)

但是你的代码并不完全正确.

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

@property (nonatomic, strong) NSLayoutConstraint *leftConstraint;
Run Code Online (Sandbox Code Playgroud)

然后创建它......

self.leftConstraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
Run Code Online (Sandbox Code Playgroud)

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

self.leftConstraint.constant = scrollView.contentOffset.x;
Run Code Online (Sandbox Code Playgroud)

然后你需要强制视图重新传出子视图......

[self.view layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)