【问题标题】:Why can't we directly change size or origin of a UIView frame?为什么我们不能直接改变 UIView 框架的大小或原点?
【发布时间】:2012-03-13 18:18:16
【问题描述】:

这对于知道这一点的人来说可能听起来很傻,但我对 iOS 还是很陌生。 我想知道,为什么我们不能修改原点或大小,或者可能是 UIView 框架的这些属性的 x、y 或高度宽度?

frame 是一个 CGRect 结构,origin 和 size 又是 CGPoint 和 CGSize 结构。 当我们可以访问它们时,为什么我们不能修改它们?

在 CGRect 中没有这样的东西,我们可以修改它的属性,为什么我们不能为 frame 或 bounds 做。

【问题讨论】:

  • 好问题,一点也不傻!
  • @ChrisNolet:我发布这个已经两年多了!
  • 做了4年iOS,终于明白为什么不能直接设置frame了!
  • 原因是他整个框架是可写/可分配的,而单个属性不是(只读)
  • 我用 Swift 编写了一个扩展,可以让你将视图框架设置为任何指定的原点。我做了一些数学运算,找出了中心位置需要在哪里才能获得所需的原点。扩展在技术上仍然设置中心属性(调整以获得所需的原点)!见stackoverflow.com/questions/10012406/…

标签: objective-c ios


【解决方案1】:

答案在于(略微混淆的)语言语法:

  1. myView 是一个 Objective-C 对象。
  2. 所以myView.frame 是一个正在发送的属性访问器方法。
  3. 它返回一个 CGRect 类型的 C 结构。
  4. frame.origin.x = 1 修改返回的代码本地临时结构。

您的意图是通过向对象发送消息来告诉对象某事。但相反,您要求对象提供数据,然后修改此数据。该对象现在永远不会。

编译器应该警告你这个错误。

【讨论】:

  • 感谢您提供简洁明了的回答。
【解决方案2】:

我假设你的意思是为什么你不能这样做:

myView.frame.origin.x = 23.0;

这是一个很好的问题,没有什么可笑的。问题在于框架是视图的属性,而不是框架的各个组件(大小和原点,甚至更深,宽度、长度、x 和 y)。

框架是视图的基础,因此如果修改了视图的框架,则需要执行许多操作。如果您要直接访问并修改 origin.x,那么您将绕过所有这些魔法可能发生的 setFrame 方法。

当您访问 view.frame 时,您将获得一个与 view.frame 具有相同值的 CGRect,但实际上不是框架,因此对其进行的任何修改都不会影响视图.

您可以分步进行:

CGRect frame = view.frame;
frame.origin.x = 23.0;
view.frame = frame;

【讨论】:

  • 感谢您的回答,不要认为这是愚蠢的。但是理解之后我确实觉得很傻。我希望任何有类似疑问的人都会觉得这很有帮助。
  • 对不起,我还是不明白。好的,通过view.frame,我们得到了一个不是真正的view.frame 的C 结构。只是说我们得到一个副本不是更简单吗?好的,所以我们得到一个副本。为什么还需要副本?
  • 没有回答为什么更新原点/大小不能更新框架?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2015-01-07
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多