[英]How to initialize and add a subview to a custom UIView?
我有一个继承自UIView的自定义视图。 现在,我想添加一个UISegmentedControl作为它的子视图。 因此,第一个问题是:UISegmentedControl的属性是弱还是强? (我知道,自2015年以来,我就使用IBOutlets苹果公司推荐使用坚固的产品)。 第二个问题是我在哪里初始化它并设置它的布局。 据我了解,我不应该在drawRect:方法中执行此操作。 它应该在initWithFrame:方法中初始化,作为子视图添加到我的自定义视图中,然后在layoutSubviews中设置其布局,如下所示:
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSArray *options = @[@"option1", @"option2", @"option3"];
_segmentedControl = [[UISegmentedControl alloc] initWithItems:options];
[_segmentedControl addTarget:self action:@selector(someAction:) forControlEvents:UIControlEventValueChanged];
[self addSubview:_segmentedControl];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGRect segmentedControlFrame = CGRectMake(self.bounds.size.width / 4.0, 50, self.bounds.size.width / 2.0, 30);
self.segmentedControl.frame = segmentedControlFrame;
self.segmentedControl.tintColor = [UIColor blackColor];
[self.segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateSelected];
}
或者只是在layoutSubviews:方法中完成所有这些操作:
- (void)layoutSubviews {
NSArray *options = @[@"option1", @"option2", @"option3"];
self.segmentedControl = [[UISegmentedControl alloc] initWithItems:options];
CGRect segmentedControlFrame = CGRectMake(self.bounds.size.width / 4.0, 50, self.bounds.size.width / 2.0, 30);
segmentedControl.frame = segmentedControlFrame;
segmentedControl.tintColor = [UIColor blackColor];
[segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateSelected];
[segmentedControl addTarget:self action:@selector(someAction:) forControlEvents:UIControlEventValueChanged];
[self addSubview:segmentedControl];
}
如果视图将保留分段控件(如果其层次结构中未包含分段控件),则应使用strong
。 当分段控件始终是层次结构的一部分时,可以使用weak
函数,但是在将其添加到层次结构之前,必须保留它的强引用。 在第一个代码段中,您必须使用一个本地(强)变量,该变量用于保存控件:
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSArray *options = @[@"option1", @"option2", @"option3"];
UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:options];
[control addTarget:self action:@selector(someAction:) forControlEvents:UIControlEventValueChanged];
[self addSubview:control]; // By now the view keeps the control
self.segmentedControl = control;
}
return self;
}
弱引用的优点是,如果您从层次结构中删除控件,它将自动重置。 这可以帮助您保持较小的内存量。
对于布局,您应该首选自动布局约束。 自动调整也是可能的(无论如何,请看看translatesAutoresizingMaskInotConstraints )。 layoutSubviews
不应将细分添加到视图,因为它被多次调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.