我试图在用户交互过程中缩放 UIView,我在 View 上实现了 CGAffineTransform,如下所示:
@implementation Tileview
{
CGAffineTransform _tempTransform;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
_tempTransform = self.transform;
self.transform = CGAffineTransformScale(self.transform, 1.2, 1.2);
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
self.transform = _tempTransform;
}
这似乎很好地缩放了 View ,但后来我注意到,在屏幕上四处移动 View 时,我开始出现不可预知的结果,并且做了一些研究后我了解到这可能是因为我正在使用自动布局。建议为层而不是 View 对象设置动画。
所以我试图重构上面的代码以使用CATranform3D
,因为它似乎无法将CAAffineTransform
应用于该层。但是 CATransform3D
可能是。但是我一直无法弄清楚如何使用该 Transform 对象来缩放图层。
我尝试按如下方式对 View 层应用变换:
self.layer.sublayerTransform = CATransform3DMakeScale(1.2, 1.2, 0.0f);
这会缩放我 View 的所有子层
但我尝试将其应用于
self.layer = CATransform3DMakeScale(1.2, 1.2, 0.0f);
我得到一个错误提示
Assignment to readonly property
我还查看了 CATransformLayer
类,但是当尝试将其分配给 self.layer 时,我收到一条错误消息:
Assignment to CATransformLayer from incompatible type CATransform3D
所以我的问题是,有没有一种方法可以在不干扰自动布局坐标的情况下缩放 UIView 的图层。
最佳答案
为什么要使用子层变换?这应该有效:
self.layer.transform = CATransform3DScale(self.layer.transform, 1.2, 1.2, 1);
如果你真的需要,你也可以通过 CATransform3DMakeAffineTransform(<#CGAffineTransform m#>)
将仿射变换应用于图层。
我注意到您正在保存初始变换以在触摸结束后应用它。您可以简单地通过
恢复初始转换self.layer.transform = CATransform3DIdentity;
关于ios - 自动布局和 CGAffineTransform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32356071/