子视图调整大小时多次调用iOS LayoutSubviews

zor*_*ruc 3 objective-c uiview ios

在我的程序中,我已经开始在init方法中完成对象的所有初始化而不设置框架,然后在layoutSubviews中我为这些对象设置框架以确保它们被正确设置.

首先,这是在没有设置框架的情况下初始化init函数中的所有对象,然后在layoutSubviews中设置每个框架的正确做法.我担心的原因是它经常被调用.

所以我有一个UIView子类,我在layoutSubviews中调用这些方法

- (void)layoutSubviews 
{
    [super layoutSubviews];
    [self.filterSwitcherView setFrame:self.viewFrame];
    [self.drawingView setFrame:self.viewFrame];
    [self.textView setFrame:self.textViewFrame];
    [self.colorPicker setFrame:self.colorPickerFrame];
}
Run Code Online (Sandbox Code Playgroud)

这当前工作正常并且所有对象都设置正确,但问题出在我的colorPicker类中,当用户触摸屏幕时我调整了colorPicker的框架,并通过这样做,这个方法从子视图colorPicker调用,它重新调整框架它不应该在子视图中被修改.子视图导致超级视图layoutSubview被调用,这不是我需要的.

我的问题是,有没有办法阻止这种行为的发生,或者我不应该使用layoutSubviews来设置框架,因为我被告知这是一种以编程方式制作视图的更好方法?

Chr*_*ris 5

在我的头顶,有两种方法来解决这个问题.您可以移动这个代码,其视图被初始化,无论是在init,initWithFrame:或者initWithCoder:,这取决于你使用的.最好是创建一个单独的方法来初始化视图的所有内容,并从所有init方法中调用它,以确保无论您如何实例化视图,它始终都能正确初始化.

或者,如果你想保留你的代码layoutSubviews,在你@interface添加一个布尔值来标记帧已经设置

@interface MyView : UIView

@property (nonatomic, assign) BOOL framesAreSet;

@end
Run Code Online (Sandbox Code Playgroud)

然后在设置框架时,检查是否已经完成

- (void)layoutSubviews 
{
    [super layoutSubviews];

    if (!_framesAreSet)
    {
        [self.filterSwitcherView setFrame:self.viewFrame];
        [self.drawingView setFrame:self.viewFrame];
        [self.textView setFrame:self.textViewFrame];
        [self.colorPicker setFrame:self.colorPickerFrame];
        _framesAreSet = YES;
    }
}
Run Code Online (Sandbox Code Playgroud)