我在一本书中进行了这个练习,并且在某一点上,有一个方法的实现,该方法创建在视图中随机放置的标签。这是代码:
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;
肯定是两次说同样的话。任何人都可以解释为什么不是这样吗?
答案 0 :(得分:3)
Objective-C重载C的struct成员访问运算符(。)以访问Objective-C对象的属性。问题是你不能在一个赋值语句中混合使用两者,因为编译器的解析器会混淆。
messageLabel
是一个具有名为frame
的属性的对象。 frame
是一个包含两个成员的结构:origin
和size
。
要解决此限制,您需要使用临时变量来保存结构(例如frame
),操作此副本(在分配时复制结构),然后分配新结构({{1 }})到属性,它更新属性的值。
答案 1 :(得分:2)
您正在修改第13行中的帧,即更改原点值。本书向您展示了一种更改框架的常用技巧,因为您无法单独更改点或大小值。