自动布局和 CGAffineTransform

Autolayout and CGAffineTransform

我试图在用户交互过程中缩放 UIView,我在视图上实现了 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;
}

这似乎可以很好地缩放视图,但后来我注意到在屏幕上四处移动视图时我开始出现不可预知的结果,并且做了一些研究我了解到这可能是因为我正在使用自动布局。建议为层而不是视图对象设置动画。

所以我试图重构上面的代码以使用CATranform3D 因为它似乎无法将CAAffineTransform 应用于图层。但是 CATransform3D 可能是。但是我一直无法弄清楚如何使用该 Transform 对象来缩放图层。

我已尝试对视图图层应用如下变换:

self.layer.sublayerTransform = CATransform3DMakeScale(1.2, 1.2, 0.0f);

这会缩放我视图的所有子图层

但我尝试将其应用于

 self.layer = CATransform3DMakeScale(1.2, 1.2, 0.0f); 

我收到一条错误消息

Assignment to readonly property

我也查看了 CATransformLayer class,但是当尝试将其分配给 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;