2014-11-12 8 views
14

Di seguito è riportato il codice che passa automaticamente tra le diverse immagini, ogni 5 secondi. Voglio aggiungere animazioni alle transizioni, ad esempio dissolvenza, scorrimento da sinistra, ecc. Come farei per farlo in Swift? Grazie.Aggiunta dell'animazione di transizione dell'immagine in Swift

class ViewController: UIViewController { 
@IBOutlet weak var imageView: UIImageView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    imageView.animationImages = [ 
     UIImage(named: "brooklyn-bridge.jpg")!, 
     UIImage(named: "grand-central-terminal.jpg")!, 
     UIImage(named: "new-york-city.jpg")!, 
     UIImage(named: "one-world-trade-center.jpg")!, 
     UIImage(named: "rain.jpg")!, 
     UIImage(named: "wall-street.jpg")!] 

    imageView.animationDuration = 25.0 
    imageView.startAnimating() 
} 

risposta

32
class ViewController: UIViewController { 
     @IBOutlet weak var imageView: UIImageView! 

     let images = [ 
       UIImage(named: "brooklyn-bridge.jpg")!, 
       UIImage(named: "grand-central-terminal.jpg")!, 
       UIImage(named: "new-york-city.jpg"), 
       UIImage(named: "one-world-trade-center.jpg")!, 
       UIImage(named: "rain.jpg")!, 
       UIImage(named: "wall-street.jpg")!] 
     var index = 0 
     let animationDuration: NSTimeInterval = 0.25 
     let switchingInterval: NSTimeInterval = 3 

     override func viewDidLoad() { 
       super.viewDidLoad() 

       imageView.image = images[index++] 
       animateImageView() 
     } 

     func animateImageView() { 
       CATransaction.begin() 

       CATransaction.setAnimationDuration(animationDuration) 
       CATransaction.setCompletionBlock { 
         let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(self.switchingInterval * NSTimeInterval(NSEC_PER_SEC))) 
         dispatch_after(delay, dispatch_get_main_queue()) { 
           self.animateImageView() 
         } 
       } 

       let transition = CATransition() 
       transition.type = kCATransitionFade 
       /* 
       transition.type = kCATransitionPush 
       transition.subtype = kCATransitionFromRight 
       */ 
       imageView.layer.addAnimation(transition, forKey: kCATransition) 
       imageView.image = images[index] 

       CATransaction.commit() 

       index = index < images.count - 1 ? index + 1 : 0 
     } 
} 

implementarlo come vista un'immagine personalizzata sarebbe meglio.

+0

funziona solo per me senza l'estensione .jpg –

+2

@LeonardoSavioDabus, credo che sia perché si mette le immagini in risorsa cataloghi. –

+0

Esattamente. Quindi se lo metto nella cartella delle risorse probabilmente dovrò usare lo stesso –

2

Ecco una classe autonoma che è possibile utilizzare per animare il cambio di immagine con l'animazione a dissolvenza.

class FadeImageView: UIImageView 
{  
    @IBInspectable 
    var fadeDuration: Double = 0.13 

    override var image: UIImage? 
    { 
     get { 
      return super.image 
     } 
     set(newImage) 
     { 
      if let img = newImage 
      { 
       CATransaction.begin() 
       CATransaction.setAnimationDuration(self.fadeDuration) 

       let transition = CATransition() 
       transition.type = kCATransitionFade 

       super.layer.add(transition, forKey: kCATransition) 
       super.image = img 

       CATransaction.commit() 
      } 
      else { 
       super.image = nil 
      } 
     } 
    } 
} 
+0

Ho aggiunto questa classe a UIImageView e per utilizzare quell'animazione ma non utilizza la transizione personalizzata. Aggiungo immagini a animationImages e dico alla vista di avviareAnimating() ma non è l'animazione personalizzata. Quindi cosa sto sbagliando? Thx – MotoxX

+0

Senza il codice non ho idea di quale potrebbe essere il problema. Se puoi, incolla il codice che hai scritto e vedrò cosa c'è che non va. https://pastebin.com/ – Ako

+0

Ho creato una nuova classe con il codice e l'ho aggiunta a UIImageView nel generatore di interfaccia. Ho aggiunto un '@IBOutlet weak var slideImageView: FadeImageView!'. Nel mio ViewController cerco di avviare l'animazione utilizzando il seguente codice: 'slideImageView.animationImages = [ UIImage (denominato: "image1") !, UIImage (denominato: "image2") !, UIImage (denominati:" image3") !, UIImage (denominato: "! image4")] slideImageView.animationDuration = 25,0 slideImageView.startAnimating() ' Spero che questo aiuta ... – MotoxX

1

codice di animazione, sulla base di this answer, in Swift 3

let animationDuration: TimeInterval = 0.25 
let switchingInterval: TimeInterval = 3 
func animateImageView() 
{ 
    CATransaction.begin() 

    CATransaction.setAnimationDuration(animationDuration) 
    CATransaction.setCompletionBlock { 
     DispatchQueue.main.asyncAfter(deadline: .now() + self.switchingInterval) { 
      self.animateImageView() 
     } 
    } 

    let transition = CATransition() 
    transition.type = kCATransitionFade 
    /* 
    transition.type = kCATransitionPush 
    transition.subtype = kCATransitionFromRight 
    */ 
    imageView.layer.add(transition, forKey: kCATransition) 
    imageView.image = images.object(at: index) as! UIImage 

    CATransaction.commit() 

    index = index < images.count - 1 ? index + 1 : 0 
}