首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UIView的setNeedsLayout、layoutIfNeeded和layoutSubviews有什么关系?

UIView的setNeedsLayout、layoutIfNeeded和layoutSubviews有什么关系?
EN

Stack Overflow用户
提问于 2010-05-11 07:31:14
回答 1查看 46.7K关注 0票数 107

有人能对UIView's setNeedsLayoutlayoutIfNeededlayoutSubviews方法之间的关系给出一个明确的解释吗?和一个示例实现,其中所有这三个都将使用。谢谢。

让我感到困惑的是,如果我向自定义视图发送一条setNeedsLayout消息,它在此方法之后调用的下一个内容是layoutSubviews,直接跳过layoutIfNeeded。从文档中,我期望流程是setNeedsLayout >导致layoutIfNeeded被调用>导致layoutSubviews被调用。

EN

回答 1

Stack Overflow用户

发布于 2012-12-20 07:15:27

我想补充一下n8grey的回答,在某些情况下,您需要先调用setNeedsLayout,然后调用layoutIfNeeded

例如,假设您编写了一个扩展UIView的自定义视图,其中子视图的定位很复杂,并且不能使用autoresizingMask或iOS6 AutoLayout完成。自定义定位可以通过覆盖layoutSubviews来完成。

例如,假设您有一个自定义视图,该视图具有一个contentView属性和一个edgeInsets属性,该属性允许在contentView周围设置边距。layoutSubviews将如下所示:

代码语言:javascript
复制
- (void) layoutSubviews {
    self.contentView.frame = CGRectMake(
        self.bounds.origin.x + self.edgeInsets.left,
        self.bounds.origin.y + self.edgeInsets.top,
        self.bounds.size.width - self.edgeInsets.left - self.edgeInsets.right,
        self.bounds.size.height - self.edgeInsets.top - self.edgeInsets.bottom); 
}

如果希望在更改edgeInsets属性时能够以动画形式显示帧更改,则需要按如下所示覆盖edgeInsets设置器,并调用setNeedsLayout,然后调用layoutIfNeeded

代码语言:javascript
复制
- (void) setEdgeInsets:(UIEdgeInsets)edgeInsets {
    _edgeInsets = edgeInsets;
    [self setNeedsLayout]; //Indicates that the view needs to be laid out 
                           //at next update or at next call of layoutIfNeeded, 
                           //whichever comes first 
    [self layoutIfNeeded]; //Calls layoutSubviews if flag is set
}

这样,在执行以下操作时,如果更改了动画块中的edgeInsets属性,则将对contentView的帧更改进行动画处理。

代码语言:javascript
复制
[UIView animateWithDuration:2 animations:^{
    customView.edgeInsets = UIEdgeInsetsMake(45, 17, 18, 34);
}];

如果不在setEdgeInsets方法中添加对layoutIfNeeded的调用,动画将无法工作,因为layoutSubviews将在下一个更新周期被调用,这等同于在动画块外部调用它。

如果只在setEdgeInsets方法中调用layoutIfNeeded,则不会发生任何事情,因为没有设置setNeedsLayout标志。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2807137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档