2016-03-14 1 views
-1

Je suis en train de passer d'une animation entre deux images (UIWindowbackgroundColor définie à l'aide d'un UIColorpatternImage). J'ai deux images myImage1 et myImage2. Je change le UIWindowbackgroundColor une fois en utilisant la fonction changeImage1() puis de nouveau en utilisant la fonction changeImage2(). J'ai également mis le view.backgroundColor = UIColor.clearColor() afin que je puisse voir ce qui se passe sur le UIWindow. Code ci-dessous.Modification de l'image UIWindow (backgroundColor en utilisant un UIColor patternImage) avec une animation

Test A:

Quand je change window.backgroundColor = UIColor.redColor()-window.backgroundColor = UIColor.blueColor(), je reçois une belle transition sur le UIWindow entre les couleurs animant rouge au bleu. (Voir le Code A.)

test B:

Cependant quand je mets une image de motif window.backgroundColor = UIColor(patternImage:...) et appeler changeImage1(), myImage1 anime bien, mais quand je puis appeler changeImage2() il n'y a pas d'animation, myImage2 remplace brusquement myImage1 . (Voir le Code B.)

Questions:

1 - Comment puis-je passer avec une animation sur UIWindow entre myImage1 et myImage2?

2 - Qu'est-ce que je manque dans mon code qui échange simplement les images au lieu d'animer entre eux, pourquoi est-myImage1 animant mais myImage2 n'est pas?

3 - Y at-il d'autres façons d'animer deux images/croix sur la dissolution UIWindow qui n'utilisent pas UIColor (patternImage: ...)?

code:

A:

func changeImage1() { 
    self.view.backgroundColor = UIColor.clearColor() //show UIWindow 

    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
     if let window = UIApplication.sharedApplication().windows.first as UIWindow! { 
      window.backgroundColor = UIColor.redColor() //Animation OK 
     } 
     }, completion: nil) 
    } 

func changeImage2() { 
    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
     if let window = UIApplication.sharedApplication().windows.first as UIWindow! { 
      window.backgroundColor = UIColor.blueColor() //Animation OK 
     } 
     }, completion: nil) 
    } 

B:

func changeImage1() { 
    self.view.backgroundColor = UIColor.clearColor() //show UIWindow 

    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
     if let window = UIApplication.sharedApplication().windows.first as UIWindow! { 
      window.backgroundColor = UIColor(patternImage: UIImage(named: "myImage1")!) //Animation OK 
     } 
     }, completion: nil) 
    } 

func changeImage2() { 
    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { 
     if let window = UIApplication.sharedApplication().windows.first as UIWindow! { 
      window.backgroundColor = UIColor(patternImage: UIImage(named: "myImage2")!) //NO animation 
     } 
     }, completion: nil) 
    } 
+1

En général, une application iOS possède une seule UIWindow et elle est invisible, inchangée et inchangée. Pourquoi faites-vous cela du tout? C'est votre contrôleur de vue racine que l'utilisateur voit à l'arrière de tout; C'est l'endroit pour faire une animation. – matt

+0

@matt Il peut être changé et être vu dans certaines circonstances, c'est pourquoi je tente d'y apporter des modifications. – user4806509

+0

@matt Pas tout à fait vrai. La plupart des applications iOS ont au moins 3 fenêtres - 1 étant utilisé pour afficher la barre d'état et 1 étant utilisé pour afficher le clavier (fenêtres système). Il existe également différents cas d'utilisation lorsque la création d'une nouvelle fenêtre (généralement seulement temporairement) est logique. Cependant, vous avez raison de dire que l'animation d'un changement de fenêtre en fenêtre est impossible. Les animations doivent toujours être effectuées sur des vues à l'intérieur d'une fenêtre, par ex. changer 'alpha' d'une vue. – Sulthan

Répondre

1

animation implique l'existence d'une série d'états intermédiaires. Il n'y a pas de notion intelligible d'un état intermédiaire entre deux images de motifs; par conséquent, cette animation (d'une image de modèle à l'autre) échoue. Une solution de contournement peut être d'animer une couleur puis, dans son gestionnaire d'achèvement, de la couleur à l'image de modèle suivante. Mais même cela pourrait échouer. En fait, je suis surpris d'apprendre que votre animation d'une couleur à une image de modèle a fonctionné en premier lieu.

+0

'window.backgroundColor = UIColor (patternImage' fonctionne la première fois, en changeant d'image, je ne m'attendais pas à ce que' UIColor patterncolor' soit traité différemment de 'UIColor'. pour animer deux images/cross dissolve sur 'UIWindow' qui n'utilisent pas d'images de modèles? – user4806509

+0

Comme je l'ai dit dans mon commentaire, je ne suis pas sympa de faire _anything_ l'UIWindow, car l'utilisateur ne devrait même jamais le voir. De toute évidence, vous pouvez simplement afficher une image en arrière-plan et la dissoudre entre une vue d'image (en conservant une couleur de motif) et une autre (en maintenant l'autre couleur de motif) – matt

+0

Les utilisateurs peuvent la voir 'UIWindow' dans une section par exemple. plus sur la vue de l'image en arrière-plan d'un UIWindow et se dissoudre entre une vue d'image (en tenant une couleur de modèle) et un autre? Si possible, montrant ce que cela pourrait ressembler dans le code? – user4806509