将 UIView.transform 设置为任意翻译 CGAffineTransform 啥都不做

Posted

技术标签:

【中文标题】将 UIView.transform 设置为任意翻译 CGAffineTransform 啥都不做【英文标题】:Setting UIView.transform to arbitrary translate CGAffineTransform does nothing将 UIView.transform 设置为任意翻译 CGAffineTransform 什么都不做 【发布时间】:2015-12-04 18:51:01 【问题描述】:

我有一个名为containerUIView,我想使用仿射变换来移动(偏移)。此视图包含UIImageView,是UICollectionViewCell 的子视图。

所以应该很简单

container.transform = CGAffineTransformMakeTranslation(100, 200) //render container 100 points right and 200 points down

相反这很困难,因为theat 代码不做任何事情。视图在同一个地方呈现,就像我删除那条线一样。所以我添加了“打印”来验证设置了哪些仿射翻译:

container.transform = CGAffineTransformMakeTranslation(100, 200)
print(container.transform) //prints: CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 100.0, ty: 200.0)

好像没问题。因此,我尝试使用CGAffineTransformMakeRotation 旋转container 视图,并且它根据documentation 旋转视图而不是围绕其中心旋转。我尝试了平移、旋转和缩放变换的不同组合,只是发现仿射变换矩阵集没问题,但属性txty 似乎被忽略了,a, b, cd 似乎使用不同的锚点然后是视图的中心(不能说那个点是什么)。

关于什么可能导致此问题以及如何解决此问题的任何想法?

【问题讨论】:

【参考方案1】:

一定有像自动布局这样的东西让你搞砸了。在没有外部影响的情况下,将视图的仿射变换设置为 CGAffineTransformMakeTranslation(100, 200) 会将其向右移动 100 点并向下移动 200 点。我通过在 Xcode 中创建一个新的单视图项目并更改 ViewController 中的 viewDidLoad 方法来验证这一点。快速上课:

override func viewDidLoad()

    super.viewDidLoad()

    view.backgroundColor = UIColor.blueColor();

    let container = UIView(frame: CGRectMake(0,0,100,100));
    container.backgroundColor = UIColor.greenColor();
    container.transform = CGAffineTransformMakeTranslation(100, 200);
    view.addSubview(container);

正如预期的那样,这使得绿色容器视图看起来向右 100 点和向下 200 点,即使它的框架是 (0,0,100,100)。

所以请检查自动布局和其他可能影响此视图放置的事情,如果您找不到任何东西,请发布更多代码。另外,如果你的容器视图没有背景色,请给它一个背景色,这样你就可以直接看到它的位置,而不是通过查看图像视图来推断它的位置。

n.b.设置视图的变换实际上并不移动视图本身,它只是改变了它绘制内容的方式/位置。

【讨论】:

我知道。在发布之前,我自己做了类似的测试。通常,翻译转换工作正常。问题是为什么它在我的情况下不起作用?感谢您提供带有背景颜色的提示,我做到了,它只是验证了容器确实在它应该在的位置。 @drasto 如果我的理解是正确的,那么容器就是您想要的位置(偏移 100,200),但其中的图像视图在您想要的位置的上方和左侧成为?图像视图的框架是什么?这听起来像是图像视图的框架在其原点具有负 X 和 Y 值。如果是这种情况,那么您需要弄清楚谁在设置图像视图的框架。您可以通过继承 UIImageView、覆盖其 Frame 和 Bounds 属性并在其中使用断点来查看它们是否被更改来做到这一点。 顺便说一句,我不知道你的具体情况是什么,但总的来说,我认为你应该远离做平移变换,只使用帧偏移。更改视图的转换可能很危险,因为它会使视图的框架“未定义”,并且会破坏大量代码中的假设。例如,如果您更改应用了非身份转换的视图的框架,您可能不会得到您想要的结果。 谢谢,但我知道。我实际上需要进行旋转和翻译,但对于 SO 问题,我将其简化为不起作用的部分。旋转部分按预期工作,当与旋转结合使用或单独使用时,平移不起作用(仅用于测试,因为通常我只会按照您的说法移动框架)。

以上是关于将 UIView.transform 设置为任意翻译 CGAffineTransform 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

IOS 以随意点为圆心 旋转UIView

蓝桥杯--矩阵翻硬币

历届试题 矩阵翻硬币

蓝桥 PREV-34 历届试题 矩阵翻硬币

算法笔记168:历届试题 矩阵翻硬币(Java)

蓝桥杯 历届试题 PREV-34 矩阵翻硬币