使用以下方法设置宽度约束实现一个进度指示器,进度从0到1,设置multiplier从0到1,当设置为0时再次更新为0.5等数值时失效;
+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c API_AVAILABLE(macos(10.7), ios(6.0), tvos(9.0));
当multiplier设置为0时,view2及attr2被系统设置为无效,如果继续通过原有约束更新multiplier就会获取不到view2和attr2,导致与预期效果存在差异。只需要控制当multiplier为0时,设置一个比较小的数值,使效果接近于0即可解决。还有其他方式,就不列出了,欢迎评论区补充。
@implementation NSLayoutConstraint (ZL)
- (instancetype)zl_setMultiplier:(CGFloat)multiplier {
[NSLayoutConstraint deactivateConstraints:@[self]];
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:self.firstItem attribute:self.firstAttribute relatedBy:self.relation toItem:self.secondItem attribute:self.secondAttribute multiplier:multiplier constant:self.constant];
[NSLayoutConstraint activateConstraints:@[newConstraint]];
return newConstraint;
}
@end