iOS - 尝试在 layoutSubviews 中的子视图上设置自动布局

Posted

技术标签:

【中文标题】iOS - 尝试在 layoutSubviews 中的子视图上设置自动布局【英文标题】:iOS - Trying to setup Autolayout on subviews in layoutSubviews 【发布时间】:2014-02-11 15:41:16 【问题描述】:

我有一个类,它最初是在没有设置框架的情况下初始化的——下面是 ClassA。 ClassA 的实例没有设置自动布局。它的框架是稍后手动设置的。但是,我希望 ClassA 的子视图能够自动布局。问题是我找不到正确的方法来做到这一点。如果我尝试在调用 layoutSubview 之前设置约束(在设置框架之前),则约束将无法验证。如果我在 layoutSubviews 中调用 Super 后尝试设置它们,我会得到这个

执行 -layoutSubviews 后仍需要自动布局。 GHTExerciseSetView的-layoutSubviews的实现需要调用super。

如果我在调用 Super 之后尝试设置约束(这似乎并不正确),起初它似乎可以工作,但是当我开始添加更多 ClassA 实例并重绘时,我遇到了更多关于约束的问题不验证。主要问题是,以这种方式布局视图的正确方法是什么。谢谢。

@interface ClassA ()

@property (nonatomic, strong) SubView1 *sub1;
@property (nonatomic, strong) SubView2   *sub2;


@end

@implementation ClassA

//this is called initially with no frame
 - (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
      sub1 = [[SubView1 alloc] init];
      sub1.translatesAutoresizingMaskIntoConstraints = NO;
      [self addSubView:sub1];

      //Same for sub2


 return self;


- (void)layoutSubViews 
     [super layoutSubViews];


- (void)updateConstraints    
    [super updateConstraints];

    //sub1 and sub2 constraints

【问题讨论】:

你能用受约束的子视图显示视图应该是什么样子吗?即应如何布置子视图等... 【参考方案1】:

我假设您的约束配置正确。

initWithFrame: 中创建视图层次结构后,尝试将updateConstraintsIfNeeded 发送到self。在我自己的应用中执行此操作似乎可以解决一些问题。

另外,updateConstraints 可能会被多次调用,因此请确保您没有一遍又一遍地安装相同的约束。

【讨论】:

以上是关于iOS - 尝试在 layoutSubviews 中的子视图上设置自动布局的主要内容,如果未能解决你的问题,请参考以下文章

iOS的layoutSubviews和drawRect方法何时调用

ios与layoutSubviews相反的是啥

iOS:动画子视图而不调用 layoutSubviews

iOS开发之layoutSubviews的作用和调用机制

iOS 5 中的 UIScrollView layoutSubviews 行为变化?

IOS-layoutSubviews方法的调用时机