【问题标题】:change subviews according to its superview frame根据其父视图框架更改子视图
【发布时间】:2014-05-28 09:40:13
【问题描述】:

我有一个自定义的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];
}

这就是问题所在,我在alloc init 之后设置了CustomViewframe。 这意味着它的框架在我更改之前是CGRectZero

因此,UILabel 的帧也为零。

在我的子视图的框架改变后如何改变我的子视图的框架?如上。

谢谢。

【问题讨论】:

    标签: ios objective-c uiview frame


    【解决方案1】:

    您只需在您的CustomView 中实现-layoutSubviews,并在其中进行子视图布局/框架计算。当您的CustomView 的框架发生变化时,-layoutSubviews 将被调用。

    编辑以进一步澄清:

    你可以为标签添加一个属性,或者使用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 仍然是一个好主意,对于任何未来的框架变化/方向变化等。

    【讨论】:

    • 谢谢,这就是我从开始学习 ios 以来一直使用initWithFrame 的原因。我只是对这个问题感到好奇:) 当我的视图和子视图在初始化后不会改变其框架时,似乎initWithFrame 更好,对吧?
    • 好吧,使用initWithFrame:(或您自己的initWithFrame:string:)可能是最好的做法,但最好也覆盖layoutSubviews :)
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多