美文网首页
Masonry 设置布局后,不能捕获Frame

Masonry 设置布局后,不能捕获Frame

作者: 凛冬将至2002 | 来源:发表于2019-08-14 18:08 被阅读0次

1.问题描述: 主动更新headViewFrame 后,frame未改变,导致后续frame修改操作出错

知识点整理 - AutoLayout 关于更新的几个方区别

  • setNeedsLayout : 告知页面需要更新,但是不会立即开始更新. 执行后会立即调用layoutSubviews
  • layoutIfNeeded: 告知页面布局立即更新. 所以一般都会和setNeedLayout 一起使用.如果希望立即生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效.
  • layoutSubviews: 系统重写布局
  • setNeedsUpdateConstraints: 告知需要更新约束,但是不会立刻开始
  • updateConstraintsIfNeeded: 告知立刻更新约束
  • updateConstraints: 系统更新约束
- (void)updateFrame:(CGFloat)height{
    
    [self.projectHeadView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(0);
        make.leading.trailing.equalTo(self.view);
        make.height.mas_equalTo(420 + height);
        [self.projectHeadView layoutIfNeeded];
    }];
    
//    masonry 设置完约束后,frame不会立即产生变化, 用layoutIfNeeded 刷新页面.
    [self.view layoutIfNeeded];

    [self updateFrame];
    
    // 延迟 0.01s 刷新view, projectHeadView 修改约束后,frame未及时产生变化,延迟后打印出来的是修改后的
//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//        [self updateFrame];
//    });
}
layoutIfNeeded 注释后 layoutIfNeeded 取消注释

相关文章

网友评论

      本文标题:Masonry 设置布局后,不能捕获Frame

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