这不起作用的原因是由于混合了两种语法。
首先你有“。”作为调用访问器函数的快捷方式(Objective-C功能)。 所以
- a.b变成[a getB];
- a.b = 5变成[a集合B:5];
然后theres“。“直接结构成员访问(纯C)所以
在设定值情况下的这样这个组合,不能正常工作。
因为...... 如果你能打电话
myView.frame.origin.x = 25.0;
的“myView.frame”部分等于[MyView的的getFrame],你会得到一个复制的CGRect帧(C结构)
的“myView.frame.origin”给你的一个CGPoint原点(也有结构)复制的CGRect
的“myView.frame.origin.x = 25.0”给你一个CGFloat的原点的x,现在你要分配的东西它和这里来的问题......
您尝试设置结构的结构变量,这没问题,但是没有从UIView指向结构的指针,因此它被复制。所以你复制,然后你设置,然后你期望设置的行动是通过初始获取转到UIView,好吧,这是行不通的。
当然,你可能想知道为什么苹果公司并没有创建一个快捷方式,所以最终你的复制框架会自动重新注入到一个自动附加的setFrame调用中,我想你只能忍受它是如何生活的。
所以记住,如果你得到一个指向帧的指针,但你不知道,你会得到一个复制的结构。
因此,如果你期望myView.frame.origin.x = 25.0
工作,你间接期望你的电话被自动翻译成某种
[myView setFrame:[myView getFrame:frame].origin.x = 25.0]
。
嗯,我想你可以承认这看起来不对。
另外想象一下,如果你得到一个直接指向CGRect框架的指针,并且你会通过该指针改变某些东西,那么UIView如何知道它的大小已经发生变化并且它必须更新自身?另一方面,如果调用[myView setFrame:newFrame],则UIView可以完成所有必要的重新调整。
+1 - 我一直在想这个问题已经有一段时间了.. – Emil 2010-06-06 10:33:28