根据超视图框架更改子视图

时间:2014-05-28 09:40:14

标签: ios objective-c uiview frame

我有一个自定义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的框架也为零。

如何在超级视图框架更改后更改我的子视图的框架?像上面一样。

感谢。

1 个答案:

答案 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仍然是一个好主意,对于任何未来的框架更改/方向更改等。