防止 CGAffineTransform 增量应用
Posted
技术标签:
【中文标题】防止 CGAffineTransform 增量应用【英文标题】:Preventing CGAffineTransform from applying incrementally 【发布时间】:2011-06-18 08:31:06 【问题描述】:我正在使用 CGAffineTransformRotate 和 CGAffineTransformTranslate 为汽车图像 (UIImageView) 在屏幕上的进度设置动画。动画由 UISlider 控制,因此当用户前进滑块时,汽车会前进并绕过拐角。对于 UISlider 上的每个点,我需要能够为汽车的 CGAffineTransformRotate 和 CGAffineTransformTranslate 属性设置一个绝对值。
但是,每次调用变换时,都会对汽车图像进行增量变换。因此,例如,如果我在滑块点 0.01 处使用它:
carImage.transform = CGAffineTransformRotate(carImage.transform, degreesToRadians(5));
carImage.transform = CGAffineTransformTranslate(carImage.transform, 4.0, - 10.0);
这在滑块点 0.02:
carImage.transform = CGAffineTransformRotate(carImage.transform, degreesToRadians(10));
carImage.transform = CGAffineTransformTranslate(carImage.transform, 8.0, - 20.0);
当滑块值为 0.02 时,我希望汽车处于 10 度,x 值为 8,y 值为 -20。但是,我得到的是 15 度的汽车,x 值为 12,y 值为 -30。它将我的第二次转换应用于第一次转换后得到的值。
如何将每个变换应用到汽车 UIImageView 的基本值?即我希望每个转换都是基于未转换的 UIImageView 的绝对转换。我不希望转换是增量的。
【问题讨论】:
【参考方案1】:看看这是否能解决你的问题,
[UIView setAnimationBeginsFromCurrentState:NO];
另一种方式: 您可以保存之前的滑块值,当您更改滑块时,获取之前和当前滑块值之间的差值,并使用该差值计算相对于之前转换的新转换。例如,如果之前的滑块值为 0.01,当前滑块值为 0.02,则差值为 0.01,因此将 4.0 添加到 tx 并添加 -10 到 ty。
【讨论】:
感谢您的回复。我试过了,但它不起作用。来自 UIView 类参考:“如果动画不在进行中或在动画块之外调用,则此方法不执行任何操作。” @beev,好的。或者,您可以保存先前的滑块值,当您更改滑块时,获取先前和当前滑块值之间的差值,并使用该差值计算相对于先前转换的新转换。例如,如果之前的滑块值为 0.01,当前滑块值为 0.02,则差值为 0.01,因此将 4.0 添加到 tx 并添加 -10 到 ty 感谢您的帮助。一段时间以来,我一直在尝试很多变化,但没有什么能让我通过滑块准确控制动画。我决定尝试以更传统的方式进行。以上是关于防止 CGAffineTransform 增量应用的主要内容,如果未能解决你的问题,请参考以下文章
将 CGAffineTransform Scale 应用于 UIView 使图层边框也变大
使用 CGAffineTransform 使用 UIViewContentModeTop 缩放 UIImageView
POSTGRES - 使用 ON CONFLICT DO NOTHING 防止串行增量 [重复]