设置UIView缩放变换而不影响其他变换

Dar*_*ren 5 core-graphics uiview quartz-2d ios

我有一个UIView,我在触摸时缩小,并在触摸结束或取消时缩小.

我一直在扩展这样的观点

缩小:

CGAffineTransform transform = CGAffineTransformMakeScale(0.95, 0.95);
self.transform = transform;
Run Code Online (Sandbox Code Playgroud)

放大:

CGAffineTransform transform = CGAffineTransformMakeScale(1.0, 1.0);
self.transform = transform;
Run Code Online (Sandbox Code Playgroud)

这不会保留任何其他变换.我知道我可以用它来保存旧的变换:

缩小:

CGAffineTransform transform = CGAffineTransformScale(self.transform, 0.95, 0.95);
self.transform = transform;
Run Code Online (Sandbox Code Playgroud)

放大:

CGAffineTransform transform = CGAffineTransformScale(self.transform, 1.0, 1.0);
self.transform = transform;
Run Code Online (Sandbox Code Playgroud)

但是,当然这里扩大规模没有影响 - 此外还有可能应用累积缩小动画.基本上我想要一种绝对应用比例变换而不影响任何其他变换的方法.有没有办法做到这一点?我不认为使用1.0/0.95作为放大因子,因为视图可能在取消或结束之前接收两次触摸.

我想我问这个问题同样的事情:只将CGAffineTransform的scale组件应用到UIView,但我不认为这里的答案对我有用.

我的目标是iOS 7及更高版本.

小智 2

我不确定这是否正是您正在寻找的,但对我来说,我需要比例始终绝对一致,所以我直接修改矩阵。

CATransform3D transform = layer.transform;
if (makeSmaller)
{
    // Scale to 0.9
    transform.m11 = 0.9f;
    transform.m22 = 0.9f;
}
// Cell needs to grow to normal size
else if (restoreToOriginal)
{
    // Scale to 1.0 again
    transform.m11 = 1.0f;
    transform.m22 = 1.0f;
}

// Set the desired Y translation
transform.m42 = desiredffset;
layer.transform = transform;
Run Code Online (Sandbox Code Playgroud)