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