iOS - 尝试在layoutSubviews中的子视图上设置Autolayout

时间:2014-02-11 15:41:16

标签: ios objective-c cocoa-touch uiview autolayout

我有一个初始化的类,没有设置框架 - 下面是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 个答案:

答案 0 :(得分:0)

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

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

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