两行代码说同样的话?

时间:2016-07-17 11:02:14

标签: objective-c frame cgrect repeat

我在一本书中进行了这个练习,并且在某一点上,有一个方法的实现,该方法创建在视图中随机放置的标签。这是代码:

 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;

肯定是两次说同样的话。任何人都可以解释为什么不是这样吗?

2 个答案:

答案 0 :(得分:3)

Objective-C重载C的struct成员访问运算符(。)以访问Objective-C对象的属性。问题是你不能在一个赋值语句中混合使用两者,因为编译器的解析器会混淆。

messageLabel是一个具有名为frame的属性的对象。 frame是一个包含两个成员的结构:originsize

要解决此限制,您需要使用临时变量来保存结构(例如frame),操作此副本(在分配时复制结构),然后分配新结构({{1 }})到属性,它更新属性的值。

答案 1 :(得分:2)

您正在修改第13行中的帧,即更改原点值。本书向您展示了一种更改框架的常用技巧,因为您无法单独更改点或大小值。