2012-01-29 3 views
1

J'essaye d'animer un UIView pour glisser à gauche et à droite. Ce que j'ai essayé est de prendre une capture d'écran de la vue actuelle, que de remplacer la vue avec la capture d'écran tout en mettant à jour le contenu de la vue hors écran, puis en faisant l'animation. Mais la capture d'écran n'apparaît pas sur l'écran. Il est juste noir jusqu'à ce que la vue d'origine revienne à l'écran. Voici le code que je utilise:Glisser un UIView à gauche et à droite

UIGraphicsBeginImageContext(self.view.window.frame.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)]; 
    iv.image = image; 
    [self.view.window insertSubview:iv aboveSubview:self.view]; 
    self.view.frame = CGRectMake(-self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
    [UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
     iv.frame = CGRectMake(self.view.frame.size.width*2, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
     [self loadData]; 
     self.view.frame = CGRectMake(0, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 
    } completion:NULL]; 
    [iv removeFromSuperview]; 
    [iv release]; 

Répondre

2

J'ai trouvé le problème. Je devais juste faire [iv removeFromSuperview]; dans le bloc d'achèvement. Maintenant ça marche.

+0

Pouvez-vous poster le code final? Je suis votre conseil, mais rencontre toujours le problème que vous décrivez (screenshot n'apparaissant pas). – user664939

+0

@ user664939 Honnêtement, je n'ai aucune idée de ce que j'ai utilisé pour cela. Mais à en juger par ma réponse, vous pouvez simplement ajouter un bloc d'achèvement pour supprimer la vue. – edc1591

+0

Merci d'avoir répondu à mon commentaire. J'ai réussi à le faire fonctionner en fonction de cela et de quelques autres questions. – user664939

-1

Habituellement, vous avez juste besoin d'une fenêtre dans votre application, celui qui contient tous vos points de vue, donc self.view.window est pas une bonne approche, je pense ...

Si J'ai ce que vous essayez d'atteindre, peut-être qu'un conteneur pourrait être la bonne solution.

Par exemple, en supposant que vous travaillez sur un iPhone:

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 960.0f, 480.0f)]; 

firstView.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f); 
secondView.frame = CGRectMake(320.0f, 0.0f, 320.0f, 480.0f); 
thirdView.frame = CGRectMake(640.0f, 0.0f, 320.0f, 480.0f); 

[containerView addSubview:firstView]; 
[containerView addSubview:secondView]; 
[containerView addSubview:thirdView]; 

Maintenant vous avez votre containerView contenant trois vues. Déplacez votre conteneurAffichez la vue à gauche ou à droite pour afficher la vue que vous aimez et masquer les deux autres vues, puis mettez à jour les vues qui ne sont pas visibles à l'écran.

Une autre approche pourrait utiliser UIScrollView en tant que containerView.

Hope this helps ...

EDIT: J'ai mal compris votre question, désolé. Suivant essayer ...

Lorsque vous ajoutez votre capture d'écran, vous l'ajoutez à droite de l'écran (hors écran)

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)]; 
    iv.image = image; 
    [self.view.window insertSubview:iv aboveSubview:self.view]; 

Ensuite, vous vous déplacez vue original sur la gauche (hors écran)

self.view.frame = CGRectMake(-self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 

Mais vous n'affichez pas votre capture d'écran, donc la vue est vide.

Je pense que vous devez changer cette

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)]; 

Pour ce

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)]; 

Ou vous pouvez ajouter une animation pour montrer de la droite.

+0

Comme je l'ai dit dans ma question, je n'utilise que deux vues, pas trois. L'idée est que je veux réutiliser self.view. C'est pourquoi j'utilise la vue d'image. – edc1591

+0

Et je n'utilise qu'une seule fenêtre. self.view.window est la fenêtre principale de l'application. – edc1591

+0

Ah ... Je vois ... Je pensais que votre problème était de glisser à gauche et à droite (en regardant votre titre) et de ne pas montrer votre capture d'écran. Jetez un oeil à mon édition. – Beppe

Questions connexes