iOS App的AppDelegate中的动画

时间:2015-06-24 19:45:38

标签: swift calayer appdelegate

我的AppDelegate中有动画。它是一个掩码,它是一个类似于Twitter发布动画的动画。它缩放然后转到全屏。我没有记录错误,但我不明白为什么我在iOS模拟器或实际设备上看不到动画。

这是我的AppDelegate:

import UIKit
import QuartzCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var mask: CALayer?
    var imageView: UIImageView?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        let imageView = UIImageView(frame: self.window!.frame)
        imageView.image = UIImage(named: "portfolioscreen")
        self.window!.addSubview(imageView)

        self.mask = CALayer()
        self.mask!.contents = UIImage(named: "BearLogo.png")!.CGImage
        self.mask!.contentsGravity = kCAGravityResizeAspect
        self.mask!.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
        self.mask!.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        self.mask!.position = CGPoint(x: imageView.frame.size.width/2, y: imageView.frame.size.height/2)
        imageView.layer.mask = mask
        self.imageView = imageView

        animateMask()

        if(NSUserDefaults.standardUserDefaults().integerForKey("visits") > 0)
        {
            var navigationController = UINavigationController(rootViewController: HomeViewController())
            window?.rootViewController = navigationController
        }
        else
        {
            window?.rootViewController = ViewController()
            NSUserDefaults.standardUserDefaults().setInteger(1, forKey: "visits")
        }
        //window?.makeKeyAndVisible()

        self.window!.backgroundColor = UIColor(red: 70/255, green: 154/255, blue: 233/255, alpha: 1)
        self.window!.makeKeyAndVisible()
        UIApplication.sharedApplication().statusBarHidden = true
        return true

    }


    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

    func animateMask() {
         let keyFrameAnimation = CAKeyframeAnimation(keyPath: "bounds")
         keyFrameAnimation.delegate = self
         keyFrameAnimation.duration = 1
         keyFrameAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
         let initalBounds = NSValue(CGRect: mask!.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.mask!.addAnimation(keyFrameAnimation, forKey: "bounds")
    }

    override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
        self.imageView!.layer.mask = nil //remove mask when animation completes
    }


}

2 个答案:

答案 0 :(得分:0)

您是否尝试使用xcode6 +的视图调试工具?它可以显示完整的视图层次结构。我相信你的imageView是在rootViewController的视图后面。

所以

  1. 分配rootViewController
  2. 使窗口键显示
  3. 然后添加并动画您的imageView

答案 1 :(得分:0)

您是否尝试过以下行:

self.window?.makeKeyAndVisible()

而不是

self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

位于didFinishLaunchingWithOptions的顶部?

UIWindow的调用会删除初始化的信息,特别是如果您使用Storyboard设置初始启动屏幕等。我遇到了另一个项目的问题而且这个简单的更改就可以了。 YMMV - 祝你好运。