为子视图定义帧大小的最佳位置在哪里?

时间:2013-08-19 18:15:38

标签: objective-c

大多数程序员在哪里指定应该有多大帧?我试图将以下代码放在.h文件的实例变量部分

    CGRect backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);

但它不会让我出于某种原因。我想把参数放在一个容易记住的地方,以便以后调试。

2 个答案:

答案 0 :(得分:4)

您无法在其声明中初始化实例变量。这就是Objective-C的方式。在这方面,它与Java或C#(或C ++ 11)不同。所有实例变量都初始化为零。

您没有说明哪个类包含此实例变量。

如果您从XIB或故事板加载对象,那么它是什么类并不重要;它将通过接收initWithCoder:消息进行初始化。因此,请在backButtonRect中初始化initWithCoder:。例如:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        CGFloat w = 100, h = 64;
        backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
    }
    return self;
}

或者,如果您在连接所有商店之前不知道wh,请在backButtonRect中初始化awakeFromNib

- (void)awakeFromNib {
    [super awakeFromNib];
    backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
}

如果你是在代码中创建对象,那么它是什么类才重要。如果它是UIView子类,则指定的初始值设定项为initWithFrame:,因此这是覆盖初始化的好方法:

- (instancetype)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        CGFloat w = 100, h = 64;
        backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
    }
    return self;
}

如果它是UIViewController子类,则指定的初始值设定项为initWithNibName:bundle:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        CGFloat w = 100, h = 64;
        backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
    }
    return self;
}

答案 1 :(得分:0)

你应该尽量不要在任何地方有明确的框架定义。如果确实需要它们,那么将它们放在带有视图定义的XIB中就可以了。如果你想在代码中指定帧,你应该尝试使事物成比例和动态,以便设置一些事物的大小,但大多数事情是根据超视图帧和静态大小的事物计算的。这支持将来针对略有不同的屏幕尺寸进行修改。

对于您需要指定的内容,在.m文件的顶部添加#define是好的。用大写和下划线命名这些是很好的,这样你就可以清楚地看到它们在读取它们被定义为常量的代码时。