J'ai un UIViewController
que j'utilise pour contrôler une vue "pop-up" pour afficher des images dans toute mon application. Il prend en charge l'autorotation, car il adapte automatiquement l'image pour qu'elle s'adapte correctement, quelle que soit l'orientation. Cela fonctionne parfaitement, mais seulement la première fois que j'initialise et affiche le contrôleur de vue. Quand il se ferme, je supprime le UIView
de ma hiérarchie de vue et libère le contrôleur de vue - mais la prochaine fois que j'instancie et l'ajoute à ma hiérarchie de vue, il cesse de recevoir les messages -shouldAutorotateToInterfaceOrientation
lorsque le téléphone est pivoté.Le contrôleur de vue n'obtient pas -shouldAutorotateToInterfaceOrientation: messages en deuxième chargement?
Voilà comment j'instancier et l'afficher:
popupVC = [[PopupVC alloc] init];
[popupVC viewWillAppear:NO];
[[[UIApplication sharedApplication] keyWindow] addSubview:popupVC.view];
[popupVC viewDidAppear:NO];
voilà comment je supprimer/relâcher une fois terminé:
[popupVC viewWillDisappear:NO];
[popupVC.view removeFromSuperview];
[popupVC viewDidDisappear:NO];
[popupVC release];
popupVC = nil;
J'ai essayé une boucle à travers [[UIApplication sharedApplication] keyWindow]
subviews pour voir si d'une certaine façon, ma vue popup n'est pas au top, mais elle l'est toujours. Et il a une adresse différente à chaque fois, donc je sais que c'est une instance différente de la classe contrôleur de vue.
Comme demandé, voici la méthode complète de loadView
PopupVC
:
- (void)loadView {
UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
myView.backgroundColor = self.overlayColor;
myView.autoresizesSubviews = NO;
myView.hidden = YES;
myView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.view = myView;
[myView release];
_isVisible = NO;
UIView *myMaskView = [[UIView alloc] initWithFrame:self.view.bounds];
myMaskView.backgroundColor = [UIColor clearColor];
myMaskView.clipsToBounds = YES;
myMaskView.hidden = YES;
myMaskView.autoresizesSubviews = NO;
myMaskView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:myMaskView];
self.imageMaskView = myMaskView;
[myMaskView release];
UIImageView *myImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
myImageView.center = self.view.center;
myImageView.hidden = NO;
myImageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
[self.imageMaskView addSubview:myImageView];
self.imageView = myImageView;
[myImageView release];
UIButton *myImageButton = [UIButton buttonWithType:UIButtonTypeCustom];
myImageButton.frame = self.view.frame;
myImageButton.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleHeight;
[myImageButton addTarget:self action:@selector(clickImage:) forControlEvents:UIControlEventTouchUpInside];
[self.imageMaskView addSubview:myImageButton];
self.imageButton = myImageButton;
UIActivityIndicatorView *myActivityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
myActivityView.hidden = YES;
[self.view addSubview:myActivityView];
myActivityView.center = self.view.center;
self.activityView = myActivityView;
[myActivityView release];
}
Quand configurez-vous le contrôleur de vue? En outre, je ne crois pas que vous devez appeler 'viewWillAppear:' explicitement, sauf si le but est d'empêcher l'animation. –
Je l'ai mis en place dans une méthode 'UITableViewDelegate', lorsque l'utilisateur sélectionne une image à afficher. Ma méthode 'PopupVC -loadView' configure la vue et les sous-vues qu'elle utilise. J'ai pris l'habitude d'appeler explicitement '-viewWillAppear:' après avoir constaté que mon 'UITabBarController' ne fonctionnait pas correctement à moins que vous ne leur envoyiez le message ... juste une habitude je suppose. – pix0r
vous ne devriez pas appeler les méthodes viewWillAppear/viewDidAppear vous-même. Je pense que vous devez repenser comment vous initialisez et nettoyez votre popup VC. –