将 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 【问题描述】:我有一个名为container
的UIView
,我想使用仿射变换来移动(偏移)。此视图包含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 旋转视图而不是围绕其中心旋转。我尝试了平移、旋转和缩放变换的不同组合,只是发现仿射变换矩阵集没问题,但属性tx
和ty
似乎被忽略了,a, b, c
和d
似乎使用不同的锚点然后是视图的中心(不能说那个点是什么)。
关于什么可能导致此问题以及如何解决此问题的任何想法?
【问题讨论】:
【参考方案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 啥都不做的主要内容,如果未能解决你的问题,请参考以下文章