大多数程序员在哪里指定应该有多大帧?我试图将以下代码放在.h文件的实例变量部分
CGRect backButtonRect = CGRectMake(2 * w/25, 18 * h/25, 6 * w/25, 2 * h/25);
但它不会让我出于某种原因。我想把参数放在一个容易记住的地方,以便以后调试。
答案 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;
}
或者,如果您在连接所有商店之前不知道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;
}
答案 1 :(得分:0)
你应该尽量不要在任何地方有明确的框架定义。如果确实需要它们,那么将它们放在带有视图定义的XIB中就可以了。如果你想在代码中指定帧,你应该尝试使事物成比例和动态,以便设置一些事物的大小,但大多数事情是根据超视图帧和静态大小的事物计算的。这支持将来针对略有不同的屏幕尺寸进行修改。
对于您需要指定的内容,在.m文件的顶部添加#define
是好的。用大写和下划线命名这些是很好的,这样你就可以清楚地看到它们在读取它们被定义为常量的代码时。