2013-08-22 55 views
0

我只是好奇你为什么不能访问view.center.x或view.center.y,但你可以访问view.center并进行更改。为什么不能访问view.center.x/y

我想写这样的代码:

imgView_.center = scrollView_.center; 
if (imgView_.frame.origin.x < 0) 
    imgView_.center = CGPointMake(imgView_.center.x + (imgView_.frame.size.width - self.view.frame.size.width)/2, imgView_.center.y); 
if (imgView_.frame.origin.y < 0) 
    imgView_.center = CGPointMake(imgView_.center.x, imgView_.center.y + (imgView_.frame.size.height - self.view.frame.size.height)/2); 

由于:

imgView_.center = scrollView_.center; 
if (imgView_.frame.origin.x < 0) 
    imgView_.center.x = imgView_.center.x + (imgView_.frame.size.width - self.view.frame.size.width)/2; 
if (imgView_.frame.origin.y < 0) 
    imgView_.center.y = imgView_.center.y + (imgView_.frame.size.height - self.view.frame.size.height)/2; 

我找不到第二个方式很多更优雅,但我不能访问x和y,所以我我想问问,如果有人知道苹果阻止它的原因是什么。

+1

这可能有所帮助:http://stackoverflow.com/a/2983979/653513 –

+0

或甚至更好:http://stackoverflow.com/a/2983939/653513 –

回答

3

UIView'sUIViewGeometry类定义中心物业如下

@property(nonatomic) CGPoint center; 

通过中心物业的声明,我们有吸气&二传手方法中心物业。它意味着我们有setter &结构的getter方法不是结构内的值。 和Center是CGPoint结构变量,其具有两个CGFloatx和y

这就是我们无法直接设置中心属性中的x和y值。它与Frame属性相似。

+0

WHYYYYYYYY?^_^ –

+0

@LordZsolt除了c和objective-c的混合之外,其中一个主要原因是有更新中心属性时需要更新的计算属性(例如框架)。直接更改结构成员将跳过此更新 – wattson12

+0

我同意@wattson,有一些相关的属性,需要更新自动更新中心和框架等属性,为什么苹果没有给任何链接设置坐标(X和Y )直接。特别是你可以在坐标相关的财产情况下看到这一点。 – Suryakant

2

UIView属性center是一个CGPoint它是struct类型,而不是一个ObjectiveC类。

即使写这篇

view.center.x = view.center.x +10; 

类似于

CGPoint center = view.center; 
center.x = center.x +10; 
view.center = center; 

他们是不同的东西。

根据编译器view.center是方法调用[view center]center.x正在访问struct CGPoint的公共ivar。如果你写了这一切在单行

view.center.x = view.center.x +10; 

编译器是无法解决此并抛出一个错误Expression is not assignable。原因是view.center.x进一步解析为函数调用,

objc_msgSend(view, @selector(center)) 

现在你正试图修改C函数的返回值如下

objc_msgSend(view, @selector(center)).x = 20 //(Some value on RHS) 

这是没有意义的函数返回值”不是个存储在任何地方,因此得到的表达式是不可分配的。

欲了解更多信息,请阅读this answer

希望有帮助!

2

在片段imgView_.center.x.center属性访问而.x字段访问。该物业的类型为CGPoint,这是一种通过传递的结构类型。

如果您有类型的变量CGPoint您可以直接分配给各个领域,如:

CGPoint myPoint; 
myPoint.x = 3; 

但是传递CGPoint值函数或方法时,你无法通过只是它的一个领域 - 它没有意义。例如。如果你有以下功能:

void doSomething(CGPoint aPoint); 

你可以通过myPoint

doSomething(myPoint); 

,但也没有办法说“刚刚通过x场” - 什么会,即使是什么意思?函数期望CGPoint,通过它的坐标是什么意思?

当您将片段imgView_.center放在作业的左侧时,您只是使用缩写来调用方法。例如: -

imgView_.center = myPoint; <=> [imgView_ setCenter:myPoint]; 

,只是像上面的函数是没有办法说“刚刚通过x场”。

重点是属性访问不是一个变量访问,即使它通常被认为是一个,但函数/方法调用;所以你不能分配给结构类型属性的单个字段。

在右侧访问属性的字段很好。例如。在RHS imgView_.center转化为[imgView_ center] - 它返回一个CGPoint,您可以访问结构价值的领域,所以在RHS imgView_.center.x转化为[imgView_ center].x,一切都OK。但是请注意,在均为个案(setCenter:center方法)中,这些方法本身采取/返回完整CGPoint

HTH。

相关问题