0

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

我想写这段代码:

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,所以我想我会问是否有人知道 Apple 阻止它的原因是什么。

4

3 回答 3

3

UIView's UIViewGeometry请参阅以下类别中定义的中心属性

@property(nonatomic) CGPoint center;

通过声明 center 属性,我们有 center 属性的getter 和 setter方法。这意味着我们有结构的 setter 和 getter 方法,而不是结构内部的值。和 Center 是一个CGPoint结构变量,具有两个CGFloatx 和 y

那是因为我们不能直接在 center 属性中设置 x 和 y 值。它类似于 Frame 属性。

于 2013-08-22T09:22:57.310 回答
2

在片段imgView_.center.x中,.center属性访问,而.x字段访问。属性的类型是CGPoint,是一种传的结构体类型。

如果您有一个类型的变量,CGPoint您可以直接分配给各个字段,例如:

CGPoint myPoint;
myPoint.x = 3;

但是,当将CGPoint值传递给函数或方法时,您不能只传递其中一个字段 - 这是没有意义的。例如,如果您具有以下功能:

void doSomething(CGPoint aPoint);

你可以通过myPoint

doSomething(myPoint);

但是没有办法说“只是通过该x领域”-这甚至意味着什么?该函数需要 a CGPoint,传递一个坐标意味着什么?

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

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

就像上面的函数一样,没有办法说“只是通过x字段”。

关键是属性访问不是变量访问,尽管它通常被认为是一种,而是函数/方法调用;因此您不能分配给结构类型属性的各个字段。

在右侧访问属性的字段很好。例如,在 rhs 上imgView_.center转换为[imgView_ center]- 返回一个CGPoint ,您可以访问结构值的字段,因此在 rhs 上imgView_.center.x转换为[imgView_ center].x,一切正常。但请注意,在这两种情况下(setCenter:center方法),方法本身都需要/返回一个完整 CGPoint的.

HTH。

于 2013-08-22T09:45:50.367 回答
2

UIView属性centerCGPoint类型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 的公共 ivar CGPoint。如果您将所有这些写在一行中

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) 

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

有关更多信息,请阅读此答案

希望有帮助!

于 2013-08-22T09:27:46.813 回答