ios 应用缩放变换时动画不稳定
ios jerky animation when applying scaling transformation
我有这个图标,我希望用户能够四处移动,当它进入其父视图的特定区域时,它应该按比例放大以表明这一点。我检索用户想要使用平移手势识别器和命令移动图标的位置:
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
}
}
将图标视图嵌套在父视图中。将位置平移应用于父视图,将比例应用于子视图。
这使转换保持独立,结果更容易预测。
应用多个变换应该没有问题。没有看到更多你的代码(动画块或网络调用响应)我将做出两个猜测
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
}
我有这个图标,我希望用户能够四处移动,当它进入其父视图的特定区域时,它应该按比例放大以表明这一点。我检索用户想要使用平移手势识别器和命令移动图标的位置:
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
}
}
将图标视图嵌套在父视图中。将位置平移应用于父视图,将比例应用于子视图。
这使转换保持独立,结果更容易预测。
应用多个变换应该没有问题。没有看到更多你的代码(动画块或网络调用响应)我将做出两个猜测
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
}