美文网首页
viewDidLoad里面更新约束动画的坑

viewDidLoad里面更新约束动画的坑

作者: 哈罗弟弟 | 来源:发表于2017-03-15 16:36 被阅读647次
1.png

界面是通过storyboard autolayout 的,就是如上图的一个效果,点击上面的button,下面的红色标记视图会动画跑到对应的button下,用的是更新约束的方法,代码如下


- (IBAction)respondsToBtn:(UIButton *)sender {

if (self.lastBtn) {

[self.lastBtn setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];

}

self.markViewCenter.active = NO;

self.markViewCenter = [NSLayoutConstraint constraintWithItem:self.markView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:sender attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];

self.markViewCenter.active = YES;

[sender setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

self.lastBtn = sender;

[UIView animateWithDuration:0.3 animations:^{

[self.view layoutIfNeeded];

}];

}

首先ios8之后作废一个约束需要用到active这个bool属性。我在 viewdidload 调用button的这个点击方法,button会出现飘逸的怪象,应该是约束冲突了。找了半天也没找到原因,最后在viewdidload里面延迟执行button的方法就对了。


dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self respondsToBtn:nil];

});

最后又尝试在viewdidload里面执行button方法前,先执行[self.view layoutIfNeeded]也变正常了。

[self.view layoutIfNeeded];

个人感觉应该是我在viewdidload里更新了约束,系统执行viewdidlayoutsubviews时Storyboard对控件又进行了约束操作,导致了冲突。我在button方法前执行 layoutIfNeeded让view先执行了layoutsubviews的操作,确定了约束,然后再更改约束,就没问题了。
以上属于个人见解,请知道原因的朋友赐教。

相关文章

网友评论

      本文标题:viewDidLoad里面更新约束动画的坑

      本文链接:https://www.haomeiwen.com/subject/lmzlnttx.html