让我们说我想暂时更改视图的框架(例如,将其向右移动10px - 可能与突出显示更改有关)。
我认为伪代码就像
self.someView.frame.origin.x += 10.0f;
但这给了我一个错误
lvalue required as left operand of assignment
所以我做的是制作一个新的CGRect来表示框架,改变CGRect然后给视图CGRect作为它的框架
CGRect aFrame = self.someView.frame;
aFrame.origin.x += 10.0f;
[self.someView setFrame:aFrame];
似乎很有趣,我可以在CGRect上进行分配,但不能在视图的CGRect框架上进行分配。
那么,这是改变现有视图的框架的最佳方法吗?
对于奖励积分:为什么我不能直接在视图的框架属性上分配新值,为什么我必须像这样绕过灌木丛呢?
由于
答案 0 :(得分:5)
对于奖励积分:为什么我不能直接在视图的框架属性上分配新值,为什么我必须像这样绕过灌木丛呢?
因为点符号在这里用于2个不同的用例:属性访问和结构成员访问。另一种写作方式
self.someView.frame.origin.x += 10.0f;
将是
[[self someView] frame].origin.x += 10.0f;
这条线更加清楚,这是行不通的。 [[self someView] frame]
检索CGRect
,但如果要更改此结构的成员,则frame
属性本身的内容不会更改。要为frame属性指定内容,必须使用-setFrame:
方法。并且-setFrame
始终需要整个CGRect
作为其参数。
答案 1 :(得分:2)
回答这个问题也可以回答奖励积分。这一切都与吸气者有关。 setter方法。
self.someView.frame是一个getter - 它返回框架&没有更深入。它不允许您进入CGRect并更改值。
因此:
CGRect r = self.someView.frame;
r.origin.x += 10.0f;
self.someView.frame = r;
毫无疑问,如果来自一种以点符号为典型方式获得& amp;无论上下文如何设置值。 Objective C点符号可能会以不可预知的方式混淆,因为Obj-C可以通过点语法调用方法以及获取属性值。因此,没有简单的方法可以知道self.someView.frame真的是self.someView.frame()(使用Pythonic语法)。
不要听起来很烦人(真的,我每天编写Python),但你真的没有使用Obj-C的标准消息传递语法在灌木丛中跳动。你绝对可以利用点语法为自己节省一些步骤,但是括号内的消息传递有一定的自我记录帮助,可以帮助你避免这些错误。
答案 2 :(得分:0)
我在github上有一个宏,可以让你像
一样@morph(self.someView.frame, _.origin.x += 10);
或者,如果您想更改x
和 width
@morph(view.frame, {
_.origin.x += 10;
_.size.width -= 10;
});