ios - 使用平移手势识别器获得平滑旋转

标签 ios core-animation calayer uipangesturerecognizer catransform3d

我正在通过从 UIPanGestureRecognizer 获取输入来围绕 y 轴旋转 CATransform3D 层:

CGPoint movement = [recognizer translationInView:self];
CGFloat trackSpread = self.bounds.size.width;
CGFloat angle = (35 * abs(movement.x))/trackSpread;
transform = CATransform3DRotate(transform, degToRad(angle), 0, 1, 0);

如果平移速度较慢,即从识别器接收连续的 x 值,则 View 会平滑旋转,但如果平移速度较快,即从识别器接收的值不连续,我会看到旋转中的跳跃(有点像层也在围绕它的旋转点平移一点)。无论平移是慢速还是快速,始终保持旋转平稳的方法是什么?

最佳答案

独立层具有隐式动画,只需更改属性即可自动发生。这就是你所看到的。当不断更新属性时,它看起来像图层滞后和落后。

如果您想在没有隐式动画的情况下更改属性,您可以在已禁用所有操作(动画的更通用名称)的事务中更改它:

[CATransaction begin];
[CATransaction setDisableActions:YES]; // no animations
myLayer.transform = newTransform;
[CATransaction commit];

您还可以通过将 NSNull 添加到该关键路径的 actions 字典中,将层配置为从不为给定的关键路径寻找动画:

myLayer.actions = @{
    @"transform": [NSNull null] // never animate "transform"
};

关于ios - 使用平移手势识别器获得平滑旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26827398/

相关文章:

iphone - 使用 colorWithPatternImage 时 UIView 的动画背景颜色

ios - 用于在 iOS 中显示 FFT 的高性能图表

ios - 每个 UIView 的边框

ios - 无法创建 IXPlaceholder Xcode 12.5

objective-c - Objective-C指针

iphone - UISlider 根据设备改变宽度

ios - 如何自定义模态视图 Controller 呈现动画?

macos - Cocoa CALayer 不显示 NSImage

ios - 仅将圆角添加到 UITableView 的顶部?

ios - 核心数据 : Predicate for first element in orderd relationship