Swift 2.2 中的循环随机动画方法

Posted

技术标签:

【中文标题】Swift 2.2 中的循环随机动画方法【英文标题】:Looping Random Animation Method in Swift 2.2 【发布时间】:2016-06-19 06:47:13 【问题描述】:

我一直在测试视图控制器内视图的随机动画。执行一次似乎效果很好。但是,当我将代码放在 while 循环中时,应用程序崩溃了; CPU 使用率加速到 100%。这是由于随机坐标的不断生成。在不使应用程序崩溃的情况下,格式化此代码以创建循环随机动画的最佳方法是什么?

func randomAnimationForPostPackets () 

func completionMethodX () -> CGFloat 

    let randomCoordinatesXInt: UInt32 = arc4random_uniform(300)

    let randCoordsX = CGFloat(randomCoordinatesXInt)

    return randCoordsX


func completionMethodY () -> CGFloat 


    let randomCoordinatesYInt: UInt32 = arc4random_uniform(300)

    let randCoordsY = CGFloat(randomCoordinatesYInt)

    return randCoordsY


UIView.animateWithDuration(5, animations: 
    self.postPacketView.center.x = completionMethodX()
    self.postPacketView.center.y = completionMethodY()

    ,completion:  (finished:Bool) in

        completionMethodX()
        completionMethodY()
)

该方法在视图控制器的 viewDidLoad 方法中实现如下:

override func viewDidLoad() 
    super.viewDidLoad()

    UIApplication.sharedApplication().statusBarStyle = .LightContent

    webBackground()
    createBlurEffectView()
    let randomPositionX : UInt32 = arc4random_uniform(300)
    let randomPositionY : UInt32 = arc4random_uniform(300)
    let randomPositionCGX : CGFloat  = CGFloat(randomPositionX)
    let randomPositionCGY : CGFloat = CGFloat(randomPositionY)

    postPacketView.frame = CGRectMake(randomPositionCGX, randomPositionCGY, 75, 75)
    self.view.addSubview(postPacketView)

    mainSegueButtonSetup()

    **randomAnimationForPostPackets()**

    userViewSetup()

    self.definesPresentationContext = true





    // Do any additional setup after loading the view.



任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在您的UIView.animateWithDuration 方法中,您需要为options: 提供参数。在这种情况下,我相信您会使用.Repeat 和/或Autoreverse 来获得您想要的效果。

请参阅UIViewAnimationOptions 的 Apple 文档,了解可用于动画的完整选项列表。

编辑您的代码以在completion: 上执行nil,而不是您列出的两个方法调用。

UIView.animateWithDuration(5, options: [.Repeat, .Autoreverse], animations: 
    self.postPacketView.center.x = completionMethodX()
    self.postPacketView.center.y = completionMethodY()

    , completion: nil
)

【讨论】:

添加 .Repeat 和 .Autoreverse: 1. 产生不明确的引用错误。 2.不会生成新的随机坐标。 2) 它不会生成新的随机坐标,因为你做了一些奇怪的嵌套函数声明。尝试摆脱两个函数 completionMethodX 和 Y 并将它们的代码添加到创建新随机数的变量中 您的函数 randomAnimationForPostPackets() 是否定义在 UIView 类中? randomAnimationForPackets() 函数在 viewController 中定义,在其中呈现视图。

以上是关于Swift 2.2 中的循环随机动画方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift:for循环中延迟的动画不起作用?

如何在主游戏循环中“随机化”动画

Swift UICollectionViewCell 动画视图在滚动时随机空白

swift自定义转场动画(比较有难度)

非常基本的 Swift 动画

Lottie Animation:停止循环,但等到动画完成