在我的程序中,我已经开始在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];
}
这当前工作正常并且所有对象都设置正确,但问题出在我的colorPicker类中,当用户触摸屏幕时我调整了colorPicker的框架,并且通过这样做,这个方法从子视图colorPicker调用它重新调整一个不应该在子视图中修改过的框架。子视图导致超级视图layoutSubview被调用,这不是我需要的。
我的问题是,有没有办法阻止这种行为发生,或者我不应该使用layoutSubviews来设置框架,因为我被告知这是一种以编程方式制作视图的更好方法?
答案 0 :(得分:5)
在我的脑海中,有两种方法可以解决这个问题。您可以将此代码移至init
,initWithFrame:
或initWithCoder:
初始化视图的位置,具体取决于您使用的位置。最好是创建一个单独的方法来初始化视图的所有内容,并从所有init
方法调用它,以确保无论您如何实例化视图,它始终都能正确初始化。
或者,如果您希望将代码保留在layoutSubviews
中,请在@interface
中添加一个布尔值来标记已设置的帧
@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;
}
}
答案 1 :(得分:3)
您的问题可能是您的colorPicker类正在处理触摸方法以调整自己的帧。相反,你应该处理colorPicker的superview类中的触摸方法,并让superview类调整colorPicker的框架以响应触摸。
另外,我建议在initWithFrame:
中进行所有UI初始化,而不是init
。原因是因为在UIView上调用init
最终会调用initWithFrame:
。