【问题标题】:UIViews and CGAffineTransformMakeScaleUIViews 和 CGAffineTransformMakeScale
【发布时间】:2014-03-10 02:42:10
【问题描述】:

我有点困惑。假设我有一个名为 myViewUIView,我们有以下代码块:

[myView setTransform:CGAffineTransformMakeScale(2.0f, 2.0f)];
[myView setTransform:CGAffineTransformMakeScale(0.5f, 0.5f)];

现在,如果我查看这段代码,我会假设这会使 UIView 的大小保持不变。然而,它实际上是原来的一半!似乎 UIView 对它们的原始大小有某种“记忆”。它是否正确?这似乎也是 Apple 做出的一个非常奇怪的选择,我希望有人能告诉我到底发生了什么以及为什么会这样。

谢谢!

【问题讨论】:

  • setTransform 替换当前变换。如果您想对当前变换应用变换,请使用名称中不带“Make”的函数变体。
  • 啊,这很有帮助!谢谢!

标签: ios objective-c uiview core-graphics transformation


【解决方案1】:

UIViewframe 属性是其在superview的坐标空间中的边界矩形。

另一方面,它的bounds 属性是视图自己的坐标空间中的边界矩形。

因此,视图大小减半可以在其frame.size 中看到(因为它的大小与其父视图相比减半),但不会在其bounds.size 中看到(因为视图本身仍然具有相同的大小)。

【讨论】:

  • 所以如果我有一个 100 像素 x 100 像素的视图,并且我在其上调用了[myView setTransform:CGAffineTransformMakeScale(2.0f, 2.0f)];,它的边界属性仍然是 (0,0,100,100)?
  • 是的。 (注意:bounds.origin 几乎总是CGPointZero,除非视图只显示其内容的一部分。UIScrollViewbounds.origin 是它的contentOffset,它的bounds.size 是它的contentSize。 )
  • 这看起来很奇怪。一旦视图被放大,即使它是 200 x 200 像素,它仍然认为自己是 100 x 100 像素?苹果决定这样做有什么特别的原因吗?看起来很不直观。
  • 好吧,视图的坐标空间(或“支持”,因为没有更好的词)仍然是 100pt x 100pt,即使它被放大了 2 倍以在其父视图中显示。
  • 在 99% 的情况下,您将设置并获取视图的 frame。回复:将bounds 设置为 (0, 0, 200, 200),这会使视图更大,而将transform 设置为 2x 比例会使视图保持相同的大小,并按字面意思缩放像素并应用抗锯齿算法。
猜你喜欢
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多