应用缩放转换时的ios jerky动画

时间:2017-12-29 22:37:37

标签: ios swift animation cgaffinetransform

我有这个图标,我希望用户能够四处移动,当它进入其父视图的特定区域时,它应该按比例放大以指示。我使用平移手势识别器和命令检索用户想要移动图标的位置:

let translationPoint = sender.translation(in: view)

然后,我尝试使用以下代码使用CGAffineTranformations为所需行为设置动画:

let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y)
var scaleTransformation: CGAffineTransform = CGAffineTransform(scaleX: 1, y: 1)

if response.shouldScaleUp {
      scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3)
}

let transformation = scaleTransformation.concatenating(moveTransformation)

然后我在图标视图上应用转换。它运行得很好,除了当我进入和退出应触发此行为的区域时它稍微猛拉一下。

我在网上看到,应用两个转换通常是一个坏主意,我想也许我应该只更新视图本身的实际帧,但动画转换更改可以更容易地重置位置用户放手(我也听说它意味着做得更轻)。

你们男孩和女孩有什么建议吗?谢谢你的帮助

更新

我的动画代码:

 DispatchQueue.main.async {
    UIView.animate(withDuration: 0.15) {
        self.iconView.transform = transformation
    }
 }

2 个答案:

答案 0 :(得分:1)

应用多个变换应该没有问题。没有看到更多的代码(动画块或网络呼叫的响应)我将做两个猜测

1)你错过了你的UIView动画块。

    let translationPoint = sender.translation(in: view)
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y)
    var scaleTransformation: CGAffineTransform = .identity

    if response.shouldScaleUp {
        scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3)
    }

    let transformation = scaleTransformation.concatenating(moveTransformation)
    DispatchQueue.main.async {
        UIView.animate(withDuration: 0.2) {
            iconView.transform = scaleTransformation
        }
    }

2)更有可能或与上述问题相结合,您尝试从网络调用更改后台线程上的UI。这可能会造成延迟和急动,并且需要包含在主动线程调用中,如上面的动画。

    let translationPoint = sender.translation(in: view)
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y)
    var scaleTransformation: CGAffineTransform = .identity

    if response.shouldScaleUp {
        scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3)
    }

    let transformation = scaleTransformation.concatenating(moveTransformation)
    DispatchQueue.main.async {
        iconView.transform = scaleTransformation
    }

答案 1 :(得分:0)

将图标视图嵌套在父视图中。将位置转换应用于父视图,将比例应用于子视图。

这使变换分离,结果更容易预测。