UIWebView, Rotation et iOS 8
NiClou
Membre
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?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ....
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
@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 ... ???
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
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
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... )