【问题标题】:Autolayout and CGAffineTransform自动布局和 CGAffineTransform
【发布时间】:2015-11-28 03:12:50
【问题描述】:

我试图在用户交互期间缩放 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); 

我收到一个错误提示

分配给只读属性

我还查看了 CATransformLayer 类,但是当尝试将其分配给 self.layer 时,我收到一条错误消息:

从不兼容的类型 CATransform3D 分配给 CATransformLayer

所以我的问题是,有没有办法在不干扰自动布局坐标的情况下缩放 UIView 的图层。

【问题讨论】:

    标签: ios catransformlayer


    【解决方案1】:

    为什么要使用子层变换?这应该有效:

    self.layer.transform = CATransform3DScale(self.layer.transform, 1.2, 1.2, 1);
    

    如果你真的需要,你也可以通过CATransform3DMakeAffineTransform(<#CGAffineTransform m#>)对层应用仿射变换

    我注意到您正在保存初始转换以在触摸结束后应用它。您可以简单地恢复初始变换

    self.layer.transform = CATransform3DIdentity;
    

    【讨论】:

    • 您好感谢您的代码。我在某处读到,我得到的不可预测的结果是因为 CGAffineTransform 与 A​​utolayout 交互的方式,建议是将变换应用于图层而不是视图
    • 上面的代码是正确且有效的。但不幸的是,将变换应用于图层与视图并不能解决最初的问题:移动视图时我仍然收到不可预测的结果。
    • @LindaKeating 我在这方面有一些经验,如果您发布更多代码或项目链接,我会调查一下。但我想在一个新问题中。
    • 感谢您的报价。但由于我能够排除自动布局/转换问题,我查看了我控制磁贴放置的逻辑,发现那里的一些问题导致了意外行为
    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2023-03-26
    • 2013-08-16
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多