2011-07-01 3 views
0

J'ai remarqué qu'après un changement d'orientation de portrait en paysage, les événements touchBegan ne s'affichent plus pour certaines parties de ma vue. Je suppose que c'est parce que je n'informe pas mon UIView sur le changement de dimension de l'image de ma fenêtre après la rotation de l'appareil.touchesBegan après didRotateFromInterfaceOrientation

J'installe tout programme (UIWindow, UIViewController, UIView) comme ceci:

myViewController = [[myUIViewController alloc] init]; 
myWindow = [[UIWindow alloc] initWithFrame: rect]; 
myView = [[myUIView alloc] initWithFrame: [myWindow bounds]]; 

[myViewController setView:myView]; 
[myWindow addSubview:myView]; 
[myWindow setFrame:rect]; 
[myWindow makeKeyAndVisible]; 

Quand je reçois la notification didRotateFromInterfaceOrientation, je mise à jour du cadre de la fenêtre comme ceci:

[[[self view] window] setFrame:rect]; 

Mais après cela, mon UIView n'obtient plus d'événements touchXXx pour toutes les zones. Il semble que seules les zones du cadre précédent signalent toujours des événements. Donc ma question: Y at-il autre chose que je dois faire dans didRotateFromInterfaceOrientation pour informer mon UIView sur le changement de dimension?

Merci pour votre aide!

EDIT: Dois-je repositionner l'UIView sur didRotateFromInterfaceOrientation() ou est-ce fait automatiquement? J'ai remarqué que la propriété "transform" de mon UIView est définie sur une matrice de transformation lorsque l'orientation change. Cependant, cela rend très difficile le repositionnement de ma vue. Les docs disent que la propriété "frame" ne peut pas être utilisée lorsqu'une transformation est active, j'ai donc essayé de modifier la propriété "center" pour repositionner ma vue, mais cela ne fonctionne pas non plus correctement. Je veux déplacer la vue vers le coin supérieur gauche, donc je mets "center" à (screenwidth/2, screenheight/2) mais il ne positionne pas la vue correctement :(Toute idée ou info ce qui doit être fait pour obtenir les événements en plein mode d'orientation?

Répondre

0

J'ai eu ce même problème, et je crois qu'il est une question de cadre.

je devais définir manuellement les rects en fonction de l'orientation, ainsi que de définir l'userInteractionEnabled sur la vue principale, comme:

if (appOrientation == 0) 
    appOrientation = [UIApplication sharedApplication].statusBarOrientation; 
if (appOrientation == UIInterfaceOrientationLandscapeLeft || appOrientation == UIInterfaceOrientationLandscapeRight) { 

    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    myView.frame = CGRectMake(0, 0, 1024, 768); 

} else { 

    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    myView.frame = CGRectMake(0, 0, 768, 1024); 
} 

myView.userInteractionEnabled = YES; 
+0

Merci, mais malheureusement, cela n'a pas aidé. C'est vraiment bizarre!Je suis en train de tester tout ça sur le simulateur. Lorsque mon application démarre, le simulateur est en mode portrait et j'obtiens parfaitement tous les événements tactiles dans l'ensemble de la zone de 320 x 480 pixels. Lorsque je fais tourner le simulateur vers la droite, puis définissez myView.frame à CGRectMake (0,0480,320), la vue ne remplit pas * l'écran entier comme je le pensais, mais la vue est décalée de 160 pixels vers la droite, donc il y a soudainement 160 pixels noirs vides sur le côté gauche de ma vue de sorte qu'une partie de ma vue est décalée en dehors de la zone visible. Je ne sais pas pourquoi !? – andy

+0

En outre, les docs disent que la propriété frame ne doit pas être utilisée lorsque la transformation est active et que la rotation du périphérique active la transformation. Au lieu de cela, les docs disent que lorsque la transformation est active, il faut utiliser les limites et les propriétés du centre. Mais ça ne marche pas non plus! Tout est assez confus ... – andy

0

OK Je sais que c'est une vieille question, mais voilà comment je résolu ce problème

.

Dans ma situation, j'avais un storyboard avec une vue qui serait affichée soit en mode portrait ou en mode paysage forcé en fonction d'un paramètre utilisateur.

Mon application affiche la barre d'état à tout moment, sauf lorsque je montre cette vue. Pour que tout cela fonctionne, les transformations ont dû être appliquées dans la méthode viewWillAppear pour un. J'ai eu le code suivant dans la méthode viewDidAppear au début et qui a joué avec les limites de l'événement touchesBegan je suppose.

Voici le code viewWillAppear:

- (void)viewWillAppear:(BOOL)animated 
{ 
    // Hide the status bar 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 

    // This is to offset the frame so that the view will take the fullscreen once the status bar is hidden 
    self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0); 

    // If view is to be displayed in landscape mode 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"orientation"]) 
    { 
     // Change status bar orientation 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft]; 

     // Turn the view 90 degrees 
     [self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/2)]; 

     // Set the frame and the bounds for the view 
     // Please Note: Frame size has to be reversed for some reason. 
     [self.navigationController.view setFrame: CGRectMake(0,0,320,480)]; 
     [self.navigationController.view setBounds: CGRectMake(0,0,480,320)]; 

     // Make sure user can interact with view 
     [self.navigationController.view setUserInteractionEnabled:YES]; 
    } 
} 

Toute autre chose qui devait arriver mise en page sage, doivent se produire dans la méthode viewDidAppear. Par exemple, j'avais une image qui couvrait toute la vue et le cadre devait être réglé en fonction de l'orientation. La définition du cadre dans viewWillAppear donnait des résultats bizarres mais le même code fonctionnait parfaitement dans viewDidAppear.

J'espère que cela aidera quelqu'un que je me suis cogné la tête pendant 6 heures sur cette chose.