两行代码说的是同一件事?
Two lines of code that are saying the same thing?
我在一本书中进行了这个练习,并且在某一时刻,有一个方法的实现可以创建随机放置在视图中的标签。这是代码:
1 - (void)drawHypnoticMessage:(NSString *)message{
2 for(int i =0; i<20; i++){
3 UILabel *messageLabel = [[UILabel alloc] init];
4 messageLabel.backgroundColor = [UIColor clearColor];
5 messageLabel.textColor = [UIColor whiteColor];
6 messageLabel.text = message;
7 [messageLabel sizeToFit];
8 int width = self.view.bounds.size.width - messageLabel.bounds.size.width;
9 int randomX = arc4random() % width;
10 int height = self.view.bounds.size.height - messageLabel.bounds.size.height;
11 int randomY = arc4random() % height;
12 CGRect frame = messageLabel.frame;
13 frame.origin = CGPointMake(randomX, randomY);
14 messageLabel.frame = frame;
15 [self.view addSubview:messageLabel];
16 }
17 }
这很好用。我的问题是关于第 12 行和第 14 行。当我将此练习从书中复制到 Xcode 并到达第 12 行时,我本能地将其更改为:
12 CGRect frame;
这没有用,我不明白为什么。对我来说,第 12 和 14 行:
12 CGRect frame = messageLabel.frame;
14 messageLabel.frame = frame;
肯定是在说同样的话两次。谁能解释一下为什么不是这样?
您正在修改第 13 行中的框架,即更改原点值。这本书向您展示了一种更改框架的常用技术,因为您无法自行更改磅值或大小值。
Objective-C 重载 C 的结构成员访问运算符 (.) 以访问 Objective-C 对象的属性。问题是你不能在一个赋值语句中混合这两者,因为编译器的解析器会混淆。
messageLabel
是一个对象,它有一个名为 frame
的 属性。 frame
是一个有两个成员的结构:origin
和 size
。
为了绕过这个限制,你需要使用一个临时变量来保存结构(例如frame
),操作这个副本(结构在分配时被复制),然后分配新的结构(frame
) 到 属性,更新 属性 的值。
我在一本书中进行了这个练习,并且在某一时刻,有一个方法的实现可以创建随机放置在视图中的标签。这是代码:
1 - (void)drawHypnoticMessage:(NSString *)message{
2 for(int i =0; i<20; i++){
3 UILabel *messageLabel = [[UILabel alloc] init];
4 messageLabel.backgroundColor = [UIColor clearColor];
5 messageLabel.textColor = [UIColor whiteColor];
6 messageLabel.text = message;
7 [messageLabel sizeToFit];
8 int width = self.view.bounds.size.width - messageLabel.bounds.size.width;
9 int randomX = arc4random() % width;
10 int height = self.view.bounds.size.height - messageLabel.bounds.size.height;
11 int randomY = arc4random() % height;
12 CGRect frame = messageLabel.frame;
13 frame.origin = CGPointMake(randomX, randomY);
14 messageLabel.frame = frame;
15 [self.view addSubview:messageLabel];
16 }
17 }
这很好用。我的问题是关于第 12 行和第 14 行。当我将此练习从书中复制到 Xcode 并到达第 12 行时,我本能地将其更改为:
12 CGRect frame;
这没有用,我不明白为什么。对我来说,第 12 和 14 行:
12 CGRect frame = messageLabel.frame;
14 messageLabel.frame = frame;
肯定是在说同样的话两次。谁能解释一下为什么不是这样?
您正在修改第 13 行中的框架,即更改原点值。这本书向您展示了一种更改框架的常用技术,因为您无法自行更改磅值或大小值。
Objective-C 重载 C 的结构成员访问运算符 (.) 以访问 Objective-C 对象的属性。问题是你不能在一个赋值语句中混合这两者,因为编译器的解析器会混淆。
messageLabel
是一个对象,它有一个名为 frame
的 属性。 frame
是一个有两个成员的结构:origin
和 size
。
为了绕过这个限制,你需要使用一个临时变量来保存结构(例如frame
),操作这个副本(结构在分配时被复制),然后分配新的结构(frame
) 到 属性,更新 属性 的值。