Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS LayoutSubview在子视图调整大小时被多次调用_Ios_Objective C_Uiview - Fatal编程技术网

iOS LayoutSubview在子视图调整大小时被多次调用

iOS LayoutSubview在子视图调整大小时被多次调用,ios,objective-c,uiview,Ios,Objective C,Uiview,在我的程序中,我开始在init方法中初始化所有对象,而不设置帧,然后在layoutSubviews中设置这些对象的帧,以确保它们被正确设置 首先,在init函数中初始化所有对象而不设置帧,然后在LayoutSubview中设置它们的每个帧,这是正确的做法。我担心的原因是它经常被调用 所以我有一个UIView子类,我在LayoutSubView中调用这些方法 - (void)layoutSubviews { [super layoutSubviews]; [self.filter

在我的程序中,我开始在init方法中初始化所有对象,而不设置帧,然后在layoutSubviews中设置这些对象的帧,以确保它们被正确设置

首先,在init函数中初始化所有对象而不设置帧,然后在LayoutSubview中设置它们的每个帧,这是正确的做法。我担心的原因是它经常被调用

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

- (void)layoutSubviews 
{
    [super layoutSubviews];
    [self.filterSwitcherView setFrame:self.viewFrame];
    [self.drawingView setFrame:self.viewFrame];
    [self.textView setFrame:self.textViewFrame];
    [self.colorPicker setFrame:self.colorPickerFrame];
}
这目前工作正常,所有对象都设置正确,但问题是在我的colorPicker类中,当用户触摸屏幕时,我调整了colorPicker的帧,通过这样做,这个方法从子视图colorPicker调用,它重新调整了一个帧,因为它不应该在子视图中修改。子视图导致调用superviews layoutSubview,这不是我需要的


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

我想有两种方法可以解决这个问题。您可以在
init
initWithFrame:
initWithCoder:
中将此代码移动到视图初始化的位置,具体取决于您使用的是哪种代码。最好的做法是创建一个单独的方法来初始化视图的所有内容,并从所有
init
方法中调用它,以确保无论如何实例化视图,它始终正确初始化

或者,如果要将代码保留在
布局子视图中
,请在
@界面
中添加一个布尔值以标记帧已设置

@interface MyView : UIView

@property (nonatomic, assign) BOOL framesAreSet;

@end
然后,在设置帧时,检查是否已经设置了帧

- (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;
    }
}

您的问题可能是您的colorPicker类正在处理touch方法来调整自己的帧。相反,您应该在colorPicker的superview类中处理touch方法,并让该superview类调整colorPicker的帧以响应触摸


另外,我建议在
initWithFrame:
中执行所有UI初始化,而不是
init
。原因是在UIView上调用
init
最终会调用
initWithFrame:

这正是我要写的。