2015-04-30 25 views
5

Voglio creare un'immagine di lancio come Twitter per la mia app ios in modo rapido.Avvia immagine Splash Screen Animazione in SWIFT

faccio capire il problema generale con le immagini di lancio animate, e ho praticamente conosco la procedura per creare una tale animazione:

  1. aggiungere una nuova vista, subito dopo l'applicazione ha lanciato, con lo stesso esatto contenuto come il launchimage
  2. Animate che vista
  3. Lasciate che la vista sparire

ho trovato questo geniale fonte: http://iosdevtips.co/post/88481653818/twitter-ios-app-bird-zoom-animation

Ma questo ragazzo usa una maschera e io non sono in grado di cambiare il suo codice per ottenere il "vero" twitter come un'animazione senza maschera, ma solo un'immagine animata (ingrandita).

Quindi, come posso aggiungere una nuova vista alla vista corrente? Se utilizzo una sottoview, come posso identificare quella vista in un secondo momento sui progressi quando devo eliminare la sottoview in animationDidStop?

Oh e mi piacerebbe fare tutto ciò che è disponibile in AppDelegate.

Ecco il mio approccio attuale:

Impostazione della visualizzazione in 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 
    } 
} 

per l'animazione:

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() 
} 

ottengo sempre un errore fatale: inaspettatamente trovato nullo mentre scartando un valore facoltativo, suppongo che questo sia dovuto allo

var emoji: CALayer { 
    return viewForLayer.layer 
} 

Io sicuramente bloccato e hanno bisogno l'aiuto della comunità StackOverflow, si prega di non giudicare perché io sono nuovo qui e solo imparare a codice swift;)

Grazie, jo

risposta

2

Non è necessario utilizzare i livelli, è possibile ottenere l'effetto zoom semplicemente tramite i blocchi di animazione UIView e UIView.

Creare un controller di visualizzazione personalizzato con solo una vista immagine aggiunta alla sua vista, assegnare il controller di visualizzazione come rootViewController di una finestra. Utilizzare un blocco di animazione UIView per aumentare la scala della vista dell'immagine (tramite CGAffineTransform). Nel blocco di completamento dell'animazione, è possibile assegnare il controller di visualizzazione iniziale effettivo a rootViewController della finestra.

+0

Grande! Per me va bene. Ho solo un problema rimasto. Una volta che l'animazione è finita, questo codice dovrebbe mostrare il mio controller rootview iniziale: Override func animationDidStop (anim: CAAnimation !, bandiera finito: Bool) {! self.window .rootViewController = Nav1()} ma per qualche ragione posso vedere solo il nav1 viewController con un'ombra molto scura su di esso e senza alcun contenuto. –

+0

rounak? O qualcun altro sa come risolvere questo problema? –

+0

@ JoF.T. hai assegnato correttamente il delegato per l'animazione? – rounak

0

E 'difficile replicare il tuo errore qui, ma posso individuare la fonte.

Quando si scrive

var emoji: CALayer { 
    return viewForLayer.layer 
} 

e successivamente chiamare su questa variabile con self.emoji, o

viewForLayer.layer.addSublayer(emoji) 

in realtà si sta implicitamente Unwrapping la variabile viewForLayer, che ha un tipo di di un facoltativo facoltativo da scartare UIView:

var viewForLayer: UIView! 

L'unica spiegazione nella mia mente è che per qualche motivo viewForLayer è pari a zero quando si chiama esso, che causerà appunto un errore quando implicitamente scartato (vale a dire usato in alcun modo).Non conosco bene il tuo codice ma non riesco a vedere dove hai inizializzato viewForLayer, con cui intendo dargli un valore non nullo.

+0

Grazie Richard. Quindi sto lavorando con lo storyboard xcode. La mia idea era di creare un nuovo UIView vuoto in modo programmatico in cui aggiungere l'animazione. Questa vista deve esistere sul mio rootviewcontroller nello storyboard? Ho provato anche quello, ma non ero in grado di collegare la vista al file AppDelegate (collegandomi intendo creare un IBOutlet). ho regolato questa riga per inizializzare la vista nel mio appdelegate: var viewForLayer = UIView (frame: CGRectMake (0, 0, 100, 100)) –

Problemi correlati