我有一个自定义UIView
类
CustomView.m
- (instancetype)initWithString:(NSString *)aString {
self = [super init];
if (!self)
return nil;
[self setAutoresizesSubviews:YES];
UILabel *label = [[UILabel alloc] init];
label.frame = ({
CGRect frame = self.frame;
frame.origin.x = CGRectGetMinX(frame) + 50;
frame.origin.y = CGRectGetMinY(frame) + 20;
frame.size.width = CGRectGetWidth(frame) - 100;
frame.size.height = CGRectGetHeight(frame) - 40;
frame;
});
[label setText:aString];
[self addSubview:label];
return self;
}
ViewController.m
-(void)addCustomView {
CustomView *custom = [CustomView alloc] initWithString:@"abc"];
custom.frame = ({
CGRect frame = self.view.frame;
frame.origin.y = CGRectGetHeight(frame) - 100;
frame.size.height = 100;
frame;
});
[self.view addSubview: custom];
}
问题是,我在frame
之后设置CustomView
的{{1}}。
这意味着在更改之前它的框架是alloc init
。
因此,CGRectZero
的框架也为零。
如何在超级视图框架更改后更改我的子视图的框架?像上面一样。
感谢。
答案 0 :(得分:3)
您只需在-layoutSubviews
中实施CustomView
,然后在那里进行子视图布局/框架计算。当-layoutSubviews
的框架发生变化时,系统会调用CustomView
。
编辑以进一步澄清:
您可以为标签添加属性,或使用tag
,以便您可以-layoutSubviews
访问它,类似这样的内容;
- (void)layoutSubviews
{
self.label.frame = ({
CGRect frame = self.frame;
frame.origin.x = CGRectGetMinX(frame) + 50;
frame.origin.y = CGRectGetMinY(frame) + 20;
frame.size.width = CGRectGetWidth(frame) - 100;
frame.size.height = CGRectGetHeight(frame) - 40;
frame;
});
}
编辑2:
当然,您可能想要做的就是更改初始化程序以包含框架,如下所示:
- (instancetype)initWithFrame:(CGRect)frame string:(NSString *)string
{
self = [super initWithFrame:frame];
if (self) {
// Do some stuff
}
return self;
}
这样,您首次创建标签时就会设置您的视图框架。然而,实施-layoutSubviews
仍然是一个好主意,对于任何未来的框架更改/方向更改等。