这是改变现有视图的UIView框架的最佳方法吗?

时间:2010-10-15 23:20:14

标签: iphone cocoa-touch uiview

让我们说我想暂时更改视图的框架(例如,将其向右移动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框架上进行分配。

那么,这是改变现有视图的框架的最佳方法吗?

对于奖励积分:为什么我不能直接在视图的框架属性上分配新值,为什么我必须像这样绕过灌木丛呢?

由于

3 个答案:

答案 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;
});