在SWIFT中启动图像启动画面动画

时间:2015-04-30 21:38:56

标签: ios swift animation core-animation splash-screen

我想在swift中为我的ios应用创建一个像启动图像的推文。

我确实理解动画启动图像的一般问题,我基本上知道创建这样一个动画的步骤:

  1. 在应用启动后立即添加一个新视图,其内容与launchimage完全相同
  2. 为该视图设置动画
  3. 让视图消失
  4. 我找到了这个精彩的来源:http://iosdevtips.co/post/88481653818/twitter-ios-app-bird-zoom-animation

    但是这个人使用了一个面具,我无法改变他的代码来获得真实的" twitter就像没有面具的动画一样,只是一个动画(放大)图像。

    那么如何在当前视图中添加新视图?如果我使用子视图,当我需要删除animationDidStop中的子视图时,如何在进度后识别该视图?

    哦,我喜欢在AppDelegate中做所有这些。

    这是我目前的做法:

    在AppDelegate中设置视图:

    import UIKit
    import QuartzCore
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var viewForLayer: UIView!
        var window: UIWindow?
    
        var emoji: CALayer {
          return viewForLayer.layer
        }
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
          self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
          // step 1: recreate the launch image
    
          self.emoji.backgroundColor = UIColor(red: 52/255, green: 52/255, blue: 52/255, alpha: 0).CGColor
          self.emoji.contents = UIImage(named: "SplashScreenEmoji")!.CGImage
    
          self.emoji.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
          self.emoji.anchorPoint = CGPoint(x: 0.5, y: 0.5)
          self.emoji.position = CGPoint(x: self.window!.frame.size.width/2, y: self.window!.frame.size.height/2)
    
          // self.window!.addSubview(viewForLayer) or
          viewForLayer.layer.addSublayer(emoji)
    
          // step 2: add the animation to that view
          animateEmoji()
    
          self.window!.makeKeyAndVisible()
          UIApplication.sharedApplication().statusBarHidden = true
          return true
        }
    }
    

    对于动画:

    func animateEmoji() {
        let keyFrameAnimation = CAKeyframeAnimation(keyPath: "bounds")
        keyFrameAnimation.delegate = self
        keyFrameAnimation.duration = 1
        keyFrameAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
        let initalBounds = NSValue(CGRect: emoji.bounds)
        let secondBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 90, height: 90))
        let finalBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 1500, height: 1500))
        keyFrameAnimation.values = [initalBounds, secondBounds, finalBounds]
        keyFrameAnimation.keyTimes = [0, 0.3, 1]
        keyFrameAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
        self.emoji.addAnimation(keyFrameAnimation, forKey: "bounds")
    }
    
    override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
        // step 3: remove the view
        self.viewForLayer.removeFromSuperview()
    }
    

    我总是遇到一个致命的错误:在解开一个Optional值时意外地发现了nil,我猜这是因为

    var emoji: CALayer {
       return viewForLayer.layer
    }
    

    我肯定卡住了,需要stackoverflow社区的帮助,请不要判断,因为我是新来的,只是学习如何编写swift;)

    谢谢, 裘

1 个答案:

答案 0 :(得分:2)

您无需使用图层,只需通过UIViewUIView动画块即可实现缩放效果。

创建一个自定义视图控制器,只将一个图像视图添加到其视图中,将该视图控制器指定为窗口rootViewController。使用UIView动画块增加图像视图的比例(通过CGAffineTransform)。在动画的完成块中,您可以将实际的初始视图控制器分配给窗口的rootViewController