0

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

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

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

4

2 回答 2

4

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

你没有说哪个类包含这个实例变量。

如果您从 XIB 或情节提要加载对象,那么它是什么类都没有关系;它将通过接收initWithCoder:消息进行初始化。所以初始化backButtonRectinitWithCoder:. 例子:

- (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;
}

或者,如果您不知道w并且h直到所有插座都连接好,请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;
}
于 2013-08-19T19:02:17.630 回答
0

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

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

于 2013-08-19T18:47:51.420 回答