在SWIFT中启动图闪屏动画

5
我想在Swift中为我的iOS应用程序创建一个类似Twitter的启动图像。
我了解动画启动图像的一般问题,并且基本上知道创建这样一个动画的步骤:
1. 在应用程序启动后立即添加一个新视图,其内容与启动图像完全相同。 2. 对该视图进行动画处理。 3. 让该视图消失。
我发现了这个出色的资源: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()
}

我常常会遇到致命错误:在解包可选值时意外发现了空值,我猜想这是由于...(需要补充更多上下文内容)
var emoji: CALayer {
   return viewForLayer.layer
}

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

谢谢, jo

2个回答

2
您不需要使用图层,您可以通过UIViewUIView动画块轻松实现缩放效果。
创建一个自定义视图控制器,仅添加一个图像视图到其视图中,将该视图控制器分配为窗口的rootViewController。使用UIView动画块增加图像视图的比例(通过CGAffineTransform)。在动画完成块中,您可以将实际的初始视图控制器分配给窗口的rootViewController

太好了!这对我有用。我只剩下一个问题了。一旦动画结束,这段代码应该显示我的初始根视图控制器:override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { self.window!.rootViewController = Nav1()}但出于某种原因,我只能看到带有非常黑暗阴影且没有任何内容的nav1视图控制器。 - Jo F.T.
Rounak?还是有其他人知道如何修复这个问题吗? - Jo F.T.
@JoF.T. 你是否正确为动画分配了代理? - rounak
你具体是什么意思?动画发生在AppDelegate中。我正在AppDelegate中创建一个名为“splashScreen”的UINavigationController,用于动画。动画也发生在AppDelegate中。你的意思是类似于splashScreen.delegate = self吗? - Jo F.T.
基本上,如果您在animationDidStop中设置断点,Xcode会在那里中断吗? - rounak
xcode能够正常运行animationDidStop函数,@rounak - Jo F.T.

0

在这里很难复制您的错误,但我可以找到源头。

当您编写时

var emoji: CALayer {
    return viewForLayer.layer
}

然后使用 self.emoji 调用此变量,或者

viewForLayer.layer.addSublayer(emoji)

你实际上正在隐式解包变量 viewForLayer,它的类型是一个隐式解包可选项 UIView

var viewForLayer: UIView!

我脑海中唯一的解释是,当你调用它时,viewForLayer 为 nil,这将在隐式解包(即以任何方式使用)时导致错误。我不太了解你的代码,但我看不到你在哪里初始化了 viewForLayer,我的意思是给它一个非 nil 的值。

谢谢Richard。我正在使用Xcode的Storyboard。我的想法是通过编程创建一个新的空UIView,在其中添加动画。这个View是否必须存在于我的故事板中的rootviewcontroller上?我也尝试过这样做,但我无法将该视图链接到appDelegate文件(链接是指创建IBOutlet)。我调整了这一行以在我的appdelegate中初始化视图: var viewForLayer = UIView(frame: CGRectMake(0 , 0, 100, 100)) - Jo F.T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接