UIWebView, Rotation et iOS 8

NiClouNiClou Membre
septembre 2014 modifié dans Objective-C, Swift, C, C++ #1

Hello,

J'ai un controller UIViewController qui contient une webview.


Lorsque je tourne le device la frame se modifie mal... meme très mal. (Uniquement sur iOS8)


 


(Je n'ai pas de fichier xib ou de storyboard pour cette vue)


 


Dans mon viewDidLoad: 



[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationChanged:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];


Puis:



- (void)onOrientationChanged:(NSNotification*)notif
{
self.currentOrientation = [[notif.userInfo objectForKey:UIApplicationStatusBarOrientationUserInfoKey] intValue];
[self animateToOrientation];

}

-(void)animateToOrientation
{
NSTimeInterval animDuration = [[UIApplication sharedApplication] statusBarOrientationAnimationDuration];
UIInterfaceOrientation fromOrientation = [[UIApplication sharedApplication] statusBarOrientation];

if(UIInterfaceOrientationIsPortrait(fromOrientation) && UIInterfaceOrientationIsPortrait(self.currentOrientation)) {
animDuration *= 2.0;
} else if(UIInterfaceOrientationIsLandscape(fromOrientation) && UIInterfaceOrientationIsLandscape(self.currentOrientation)) {
animDuration *= 2.0;
}


[UIView animateWithDuration:animDuration
delay:0.0
options:(UIViewAnimationOptions) (UIViewAnimationOptionLayoutSubviews | UIViewAnimationOptionBeginFromCurrentState)
animations:^{
[self orientView];
}
completion:nil];
}

-(void)orientView
{
[self setTransform:[self transformForOrientation:self.currentOrientation]];
[self setFrame:[self contentRectInScreenForStatusBarFrame:self.statusBarFrame inOrientation:self.currentOrientation]];
}


-(CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orient
{
switch(orient)
{
case UIInterfaceOrientationPortrait: return CGAffineTransformIdentity;
case UIInterfaceOrientationPortraitUpsideDown: return CGAffineTransformMakeRotation(M_PI);
case UIInterfaceOrientationLandscapeLeft: return CGAffineTransformMakeRotation(-M_PI_2);
case UIInterfaceOrientationLandscapeRight: return CGAffineTransformMakeRotation(M_PI_2);

default:
return CGAffineTransformIdentity;
}
return CGAffineTransformIdentity;
}


-(CGRect)contentRectInScreenForStatusBarFrame:(CGRect)statusBarFrame inOrientation:(UIInterfaceOrientation)orientation {
CGRect finalRect = [[[UIApplication sharedApplication] keyWindow] frame];

switch(orientation)
{
case UIInterfaceOrientationPortrait:
finalRect.origin.y += statusBarFrame.size.height;
case UIInterfaceOrientationPortraitUpsideDown:
finalRect.size.height -= statusBarFrame.size.height;
break;
case UIInterfaceOrientationLandscapeLeft:
finalRect.origin.x += statusBarFrame.size.width;
case UIInterfaceOrientationLandscapeRight:
finalRect.size.width -= statusBarFrame.size.width;
break;
case UIInterfaceOrientationUnknown:
break;
}

return finalRect;
}

Bref, ça rotatione mal, et ça me prend la tete :/


 


Une idée du pourquoi du comment seulement sur iOS8?


Réponses

  • AliGatorAliGator Membre, Modérateur
    Pourquoi te prends-tu la tête à  recoder tout le code de rotation ?

    Pourquoi ne pas mettre simplement un AutoResizingMask ou des contraintes et laisser iOS faire tout le boulot ?
  • Ali... Pourquoi je cherchais a faire compliqué? -.-'

    Tu as tout à  fait raison ! Merci !


  • Salut,


     


    J'ai le même problème que NiClou, à  savoir que je gère la rotation d'une image en fonction du UIDeviceOrientation, j'applique donc une transformation CGAffineTransformationMakeRotation sur ma UIImageView.


    Tout se passe bien pour ce qui est de la rotation depuis et vers UIDeviceOrientationPortrait, UIDeviceOrientationPortraitUpSideDown et UIDeviceOrientationLandscapeRight, mais pour UIDeviceOrientationLandscapeLeft la rotation fait 180° de plus ! WTF ?!


     


    Vous constaterez que dans mon code je gère cela correctement (enfin je pense) et le pire c'est que l'app compilée avec le SDK 8.0 tourne sans bug sous iOS7 !!!! mais bug sous le 8.0 ....  :'(



    - (void)layoutForOrientation:(UIDeviceOrientation)orientation animated:(BOOL)animated
    {
    CGAffineTransform transform;

    switch (orientation) {
    case UIDeviceOrientationPortrait :
    transform = CGAffineTransformIdentity;
    break;

    case UIDeviceOrientationLandscapeLeft :
    transform = CGAffineTransformMakeRotation(M_PI_2);
    break;

    case UIDeviceOrientationLandscapeRight :
    transform = CGAffineTransformMakeRotation(-M_PI_2);
    break;

    case UIDeviceOrientationPortraitUpsideDown :
    transform = CGAffineTransformMakeRotation(M_PI);
    break;

    default:
    return;
    break;
    }

    float duration = 0.3;
    if (animated == NO) {
    duration = 0;
    }

    [UIView animateWithDuration:duration
    delay:0
    options:(UIViewAnimationOptionCurveEaseInOut) animations:^{
    [self.logoImage setTransform:transform];
    }
    completion:nil];
    }

    J'ai tenter de bidouiller les calculs mais rien a faire, il y a toujours une orientation qui n'en fait qu'a sa tête ...


     


    Une idée ?


     


    Ali Gator tu parlais de laisser le système gérer cad ? 


     


     


    Merci par avance de l'aide que vous pourrez m'apporter 


     


    ++ MiKo


  • CéroceCéroce Membre, Modérateur

    @MiKO: tu cherches à  faire quoi ? Là , on dirait que tu veux que l'image soit toujours dans la même direction quelque soit l'orientation du device.


     


    Normalement, on n'a pas à  gérer les rotations: c'est le système qui effectue la rotation, et c'est à  nous de gérer le redimensionnement des vues qui en résulte.


  • @Céroce, c'est exactement ça :)


     


    J'intercepte la notification du changement d'orientation et j'applique une rotation sur mon image en fonction de celle-ci.


     


    Le bug est sur la UIDeviceOrientationLandscapeLeft où au lieu de d'appliquer un angle de -90° comme pour UIDeviceOrientationLandscapeRight, la elle fait 180° de plus ...


     


    Incompréhenssible ...  ???


  • AliGatorAliGator Membre, Modérateur

    J'intercepte la notification du changement d'orientation et j'applique une rotation sur mon image en fonction de celle-ci.

    Mais pourquoi donc ?!
  • Euh ...


     


    pcq quand l'orientation change une notif est send et que la classe qui l'observe l'intercepte et la traite le cas échéant.


    pcq je viens d'arriver sur ke sujet et que je découvre l'app et l'étendu des dégâts ...


    pcq je ne sais pas faire autrement aussi ...  ??? j'ai toujours galérer à  gérer les orientations des devices ... 


  • Je vais déposer plainte pour le copyright du pseudo :) 


  • Joanna CarterJoanna Carter Membre, Modérateur

    Comme Céroce et Ali, je te conseillerais de (re)voir les docs sur autolayout et rotation. Normalement, il faut que mettre en place les contraints et on serait là .


     


    Avec iOS8, on gère la rotation avec la méthode déléguée -willTransitionToTraitCollection:withTransitionCoordinator:


     


    Il y a une vidéo WWDC 2014 N° 214 qui l'explique


  • Joanna CarterJoanna Carter Membre, Modérateur


    Je vais déposer plainte pour le copyright du pseudo :)




    Dans ce cas là , il fallait utiliser la marque © sur ton pseudo  ::)

  • AliGatorAliGator Membre, Modérateur

    Je vais déposer plainte pour le copyright du pseudo :)

    Mettez donc des avatars aussi, parce que là  si vous n'en avez ni l'un ni l'autre on va effectivement vite vous confondre tous les deux :D


  • Dans ce cas là , il fallait utiliser la marque © sur ton pseudo  ::)




     


    Bon j'ai changé... (c'est Lou, plutôt que Milko ,... mais attention à  vos pseudos, on risquerait de voir un JoannO Carter dans pas longtemps... ;) )

  • Joanna Cartier c'est plus chic ..
Connectez-vous ou Inscrivez-vous pour répondre.