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