2010-10-15 49 views
3

可以说我想临时更改视图的框架(例如,将其向右移动10px--可能与突出显示更改有关)。这是改变现有视图的UIView框架的最好方法吗?

我以为伪代码会是这样的

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]; 

似乎有趣,我可以m在CGRect上做一个赋值,但不在CGRect的视图框架上。

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

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

谢谢

回答

5

对于奖励要点:为什么我不能直接在视图的框架属性上分配一个新的值,为什么我必须击打这样的灌木丛呢?

由于点符号用于两种不同的用例:属性访问和结构成员访问。另一种方式来写

self.someView.frame.origin.x += 10.0f; 

[[self someView] frame].origin.x += 10.0f; 

这条线使得它更清晰,这是行不通的。[[self someView] frame]检索CGRect,但如果您要更改此结构的成员,则frame属性本身的内容不会更改。要将某些内容分配给框架属性,必须使用-setFrame:方法。并且-setFrame始终需要整个CGRect作为它的参数。

+0

谢谢Ole。我现在看到,由于视图的框架属性设置为接收CGRect,因此不会设置相同的属性来了解CGRect的工作原理。矩形只是一个值得传递给它的值。如果我将框架放入它自己的var中,那么它知道CGRects如何工作,以便我可以操纵该结构。灯泡时刻! – davidamcclain 2010-10-17 14:49:45

2

回答这个问题的答案也是奖励积分。这是关于获得者的设置者。

self.someView.frame是一个获得者 - 它返回帧&不会更深。它不允许你进入CGRect并修改值。

这样:

CGRect r = self.someView.frame; 
r.origin.x += 10.0f; 
self.someView.frame = r; 

这是毫无疑问,混乱,如果从那里点符号是越来越&设定值,无论背景下的典型方式各种语言中。目标C点符号可能会以未知的方式混淆,因为Obj-C可以通过点语法调用方法以及获取属性值。因此,没有简单的方法知道self.someView.frame真的是self.someView.frame()(使用Pythonic语法)。

不要听起来很讨厌(实际上,我每天都在编程Python),但是你真的没有使用Obj-C的标准消息传递语法在灌木丛中跳动。您绝对可以利用点语法来节省自己的一些步骤,但括号内的消息传递具有一定的自我记录帮助,并可帮助您避免此类错误。

+0

现在有道理,感谢bobwaycott。我来自Ruby背景,所以我认为,因为我可以看到矩阵中的值,所以我可以改变它们。我现在明白为什么我不能。感谢您的回答。 – davidamcclain 2010-10-17 14:52:18

0

我已经有了github宏,可以让你做这样

@morph(self.someView.frame, _.origin.x += 10); 

或者,如果你想改变xwidth

@morph(view.frame, { 
    _.origin.x += 10; 
    _.size.width -= 10; 
}); 
相关问题