ios - 自动布局和 CGAffineTransform

标签 ios catransformlayer

我试图在用户交互过程中缩放 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/

相关文章:

ios - 在 CATransformLayer iOS 中使用 CATransform3D 从右到左改变透视角度

iphone - CATransform3DTranslate 之后的 CATransform3DRotate

ios - iOS 上的 SSL 固定

ios - 如何在 iOS 中为圆形路径上的标签设置动画?

ios - 在 iOS 上,为什么设置层的 sublayerTransform 会使其自身像 CATranformLayer 一样工作?

ios - 对于最初为零大小的 View 的无法满足的布局约束,有更好的解决方法吗?

ios - 如何根据 RestKit 中的关键路径分离相似的实体映射?

IOS 在离开 Controller 时删除缓存 - kingfisher

ios - 即使从 Facebook 应用程序设置中删除应用程序后,用户仍可以访问应用程序