繁体   English   中英

如何初始化子视图并将其添加到自定义UIView?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM