1

我的视图控制器中有一个变量CGFloat x。我用这个变量创建了一个框架:

CGRectMake(x,x,4*x,4*x)

何时x更改,我希望 frame 的值也可以更改,而无需任何手动更新。我怎样才能做到这一点?

4

2 回答 2

3

没有办法“深拷贝” a CGFloat,因为CGFloat它是原始类型,而不是对象。此外,CGRect是一个struct,而不是一个对象,所以它由CGFloat一个接一个存储的 4 个组成。不是对CGFloats 的引用,而是原始值本身。

但是,如果您声明x为视图控制器的属性:

@property CGFloat x;

然后你可以覆盖 setterx来更新你的框架的值:

- (void)setX:(CGFloat)x {
    _x = x;
    self.myFrame = CGRectMake(x, x, x * 4, x * 4);
}

这样,每次更改xusingself.x = whatever时,都会调用 setter 方法并更新您的框架。

这基本上是最安全最可靠的方式了,只要记得设置xbyself.x = whatever,如果_x直接设置底层的 ivar,setter 不会被调用,frame 也不会更新。

于 2013-05-20T07:50:16.213 回答
1

你不能复制不可变数据。所以你不能复制 CGFloat。但是如果你想在这种情况下改变你的框架,你需要在 X 属性的 setter 方法中设置你的框架。

于 2013-05-20T07:52:36.837 回答