【问题标题】:Automatically update CGRect based on changing value of CGFloat根据 CGFloat 的变化值自动更新 CGRect
【发布时间】:2013-05-20 07:42:35
【问题描述】:

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

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

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

【问题讨论】:

  • CGFloat 是不可变的(它甚至不是真正的对象,因为它分解为原始类型)。没有必要对其进行“深度复制”。问题可能类似于:“如何制作一个动态变化的 CGRect(基于变量)?”

标签: ios objective-c cgrect


【解决方案1】:

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

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

@property CGFloat x;

然后你可以覆盖x的setter来更新你的frame的值:

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

这样,每次你使用self.x = whatever更改x,都会调用setter方法,更新你的frame。

这基本上是最安全和最可靠的方法,只要您记住设置x by self.x = whatever,如果您设置直接底层ivar_x,不会调用setter,也不会更新frame。

【讨论】:

  • 感谢您的回答。但是如果有大约 50 个不同框架的 uiview,那么我们如何为每个设置框架?
  • 拥有一个包含所有UIViews 的数组并循环遍历它以设置每个人的框架。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多