ios - 动画的动态 UIBezierPath

标签 ios swift animation core-animation paintcode

我想创建一个动画,其中对象沿 path 设置其位置动画。我遇到的问题是使这个 path 动态意味着它适用于所有屏幕尺寸。

上面 gif 中的宇宙飞船最初遵循“U”形路径

我使用这个“U”形 path 并且它有效,这是代码:

func animateAlongPath() {
    // Create and add image to view
    let myImage = UIImage(named: "myImage")!
    let myImageView = UIImageView(image: myImage)

    myImageView.frame = CGRect(x: 100, y: 100, width: myImage.size.width, height: myImage.size.height)
    holderView.addSubview(myImageView)

    // Create "U" shape path for animation (path code created in PaintCode)
    let path = UIBezierPath()
    path.moveToPoint(CGPointMake(59.5, 81.5))
    path.addCurveToPoint(CGPointMake(66.5, 91.5), controlPoint1: CGPointMake(63.64, 84.13), controlPoint2: CGPointMake(62.62, 85.9))
    path.addCurveToPoint(CGPointMake(81.5, 110.5), controlPoint1: CGPointMake(72.31, 99.88), controlPoint2: CGPointMake(75.91, 103.08))
    path.addCurveToPoint(CGPointMake(109.5, 142.5), controlPoint1: CGPointMake(88.44, 119.71), controlPoint2: CGPointMake(102.39, 135.23))
    path.addCurveToPoint(CGPointMake(145.5, 156.5), controlPoint1: CGPointMake(122.47, 155.76), controlPoint2: CGPointMake(129.15, 157.54))
    path.addCurveToPoint(CGPointMake(237.5, 81.5), controlPoint1: CGPointMake(185.04, 153.99), controlPoint2: CGPointMake(237.5, 81.5))

    let pathAnimation = CAKeyframeAnimation(keyPath: "position")
    pathAnimation.path = path.CGPath // Use "U" shape path for animation
    pathAnimation.calculationMode = kCAAnimationPaced
    pathAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
    pathAnimation.duration = 1
    pathAnimation.removedOnCompletion = false
    pathAnimation.fillMode = kCAFillModeForwards

    myImageView.layer.addAnimation(pathAnimation, forKey: nil)
    myImageView.layer.position = path.currentPoint
}

问题是 UIBezierPath 不是动态的。它适用于 iPhone 6 设备屏幕尺寸,但不适用于任何其他设备尺寸,因为它是静态的。我尝试使用 PaintCode 创建带有变量的动态路径,但就是无法正常工作。

有什么想法吗?

最佳答案

PaintCode 可以使用 Frames 为可调整大小的 UIBezierPaths 生成代码。

Bezier 放入 Frame 对象中,然后设置所需的自动调整 Spring (全部灵活)。生成的代码将使用 CGRect/NSRect 进行参数化,并将使用相关系数来计算贝塞尔点。

还有视频教程about Dynamic Shapes如果您想更深入地了解。

PaintCode Bezier in Frame

关于ios - 动画的动态 UIBezierPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685470/

相关文章:

android - 如何更改最近应用程序上的磁贴

ios - 如何按值的降序从 firebase 获取数据?

ios - swift UIApplication.setStatusBarStyle 不起作用

ios - Apple Swift - 无法从 CMPedometer 的处理程序中检索数据

ios - UIView动画 block 中的图层动画

iOS - 安排多个本地通知,UNCalendarNotificationTrigger

ios - 隐藏导航栏时的假状态栏颜色

iphone - 核心数据未正确显示 sqlite 文件数据

iphone - 如何使 View 像揉皱的纸一样动画

java - android studio中的顺序动画,循环