UIWebView ne se redimensionne pas correctement lorsque l'orientation change?
J'ai ajouter une webview,un titleLabel et un coverflowView sur un viewcontroller est d'avis que ses sous-vues, je le veux changer de taille lorsque le changement d'orientation. J'ai changer la webview cadre de cette méthode:
- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration
son contenu n'a redimensionner lors de la rotation de l'iPad à partir de orientationLandscape à orientationPortrait ou de orientationPortrait à orientationLandscape si je démarrer l'application avec l'orientation portrait, mais c'est tellement étrange que son contenu ne marche pas redimensionner quand j'ai démarrer l'application avec l'orientation paysage...Mais le NSLog montre l'image a changé. Quant à la titleLabel et la coverflowView, ils redimensionner correctement. Je doute si c'est à cause de css?J'ai utiliser css pour contrôler le contenu de style en fonction de la hauteur et la largeur de webview.Est-ce quelqu'un pourrait m'aider à trouver la raison? le code est ci-dessous:
- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration: (NSTimeInterval)duration {
double i = 0;
NSInteger width=self.view.frame.size.width;
NSInteger height=self.view.frame.size.height;
NSLog(@"view :%@",[self.view description]);
switch (toInterfaceOrientation){
case UIInterfaceOrientationPortrait:
{
NSLog(@"rotate to Portrait");
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
self.docView.frame=CGRectMake(0, 50, width+20, height-70);
self.toolbar.frame=CGRectMake(0, 0,height , 50);
for (UIView * view in [toolbar subviews]) {
if ([view isKindOfClass:[UIButton class]] && view.tag==kBackButtonTag){
view.frame=CGRectMake(width-60, 6, 50, 36);
}else if([view isKindOfClass:[UIButton class]] && view.tag==kReloadButtonTag){
view.frame=CGRectMake(width-160, 6, 80,36 );
}
}
[coverflow setFrame:CGRectMake(0, 0 , width+20, height/2-50)];
[titleLabel setFrame:CGRectMake(width/2-40,height/2-100, 100, 20)];
if ([[[UIDevice currentDevice]model]isEqualToString:@"iPad"]) {
self.viewer.frame=CGRectMake(0, 0, 768, 1004);
}else{
self.viewer.frame=CGRectMake(0, 0, 320, 480);
}
}
i=0;
}break;
case UIInterfaceOrientationPortraitUpsideDown:
{
NSLog(@"rotate to PortraitUpsideDown");
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
self.docView.frame=CGRectMake(0, 50, width+20, height-70);
self.toolbar.frame=CGRectMake(0, 0,height , 50);
for (UIView * view in [toolbar subviews]) {
if ([view isKindOfClass:[UIButton class]] && view.tag==kBackButtonTag) {
view.frame=CGRectMake(width-60, 6, 50, 36);
}else if([view isKindOfClass:[UIButton class]] && view.tag==kReloadButtonTag){
view.frame=CGRectMake(width-160, 6, 80,36 );
}
}
[coverflow setFrame:CGRectMake(0, 0 , width+20, height/2-50)];
[titleLabel setFrame:CGRectMake(width/2-40,height/2-100, 100, 20)];
if ([[[UIDevice currentDevice]model]isEqualToString:@"iPad"]) {
self.viewer.frame=CGRectMake(0, 0, 768, 1004);
}else{
self.viewer.frame=CGRectMake(0, 0, 320, 480);
}
}
i=180;
} break;
case UIInterfaceOrientationLandscapeLeft:{
NSLog(@"rotate to LandscapeLeft");
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
// self.coverflow.frame=CGRectMake(0, 0, height+20, width-20);
self.docView.frame=CGRectMake(0, 50, height+20, width-70);
self.toolbar.frame=CGRectMake(0, 0,height+20 , 50);
for (UIView * view in [toolbar subviews]) {
if ([view isKindOfClass:[UIButton class]] && view.tag==kBackButtonTag) {
view.frame=CGRectMake(height-60, 6, 50, 36);
NSLog(@"button %@",[view description]);
}else if([view isKindOfClass:[UIButton class]] && view.tag==kReloadButtonTag){
view.frame=CGRectMake(height-160, 6, 80,36 );
}
}
[coverflow setFrame:CGRectMake(0, 0 , height+20, width/2-50)];
[titleLabel setFrame:CGRectMake(height/2-40,width/2-80, 100, 20)];
if ([[[UIDevice currentDevice]model]isEqualToString:@"iPad"]) {
self.viewer.frame=CGRectMake(0, 0, 1024, 748);
}else{
self.viewer.frame=CGRectMake(0, 0, 480, 320);
}
}
i = 90;
}break;
case UIInterfaceOrientationLandscapeRight:{
NSLog(@"rotate to LandscapeRight");
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
// self.coverflow.frame=CGRectMake(0, 0, height+20, width-20);
self.docView.frame=CGRectMake(0, 50, height+20, width-70);
self.toolbar.frame=CGRectMake(0, 0,height+20 , 50);
for (UIView * view in [toolbar subviews]) {
if ([view isKindOfClass:[UIButton class]] && view.tag==kBackButtonTag) {
view.frame=CGRectMake(height-60, 6, 50, 36);
}
else if([view isKindOfClass:[UIButton class]] && view.tag==kReloadButtonTag){
view.frame=CGRectMake(height-160, 6, 80,36 );
}
}
[coverflow setFrame:CGRectMake(0, 0 , height+20, width/2-50)];
[titleLabel setFrame:CGRectMake(height/2-40,width/2-80, 100, 20)];
if ([[[UIDevice currentDevice]model]isEqualToString:@"iPad"]) {
self.viewer.frame=CGRectMake(0, 0, 1024, 748);
}else{
self.viewer.frame=CGRectMake(0, 0, 480, 320);
}
}
i = -90;
}break;
}
//[webViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
//[self.view setNeedsDisplay];
// NSLog(@"coverflowView :%@",[self.coverflow description]);
NSLog(@"webview :%@",[viewer description]);
[viewer stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.__defineGetter__('orientation',function(){return %f;});",i]];
[viewer stringByEvaluatingJavaScriptFromString:@"var e = document.createEvent('Events'); e.initEvent('orientationchange', true, false); document.dispatchEvent(e); "];
}
- (void)viewDidLoad {
self.view.clipsToBounds=YES;
self.view.autoresizesSubviews=YES;
//self.view.autoresizingMask=UIViewAutoresizingNone;
viewer=[[UIWebView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:viewer];
viewer.delegate=self;
viewer.scalesPageToFit=NO;
viewer.autoresizesSubviews=NO;
viewer.autoresizingMask=UIViewAutoresizingNone;
viewer.dataDetectorTypes=0;
//viewer.autoresizingMask=UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;
NSLog(@"webView :%@",[viewer description]);
// [viewer setFrame:CGRectMake(0, self.view.bounds.size.height/2 , self.view.bounds.size.width, self.view.bounds.size.height/2)];
// [viewer setBounds:CGRectMake(0, self.view.bounds.size.height/2 , self.view.bounds.size.width, self.view.bounds.size.height/2)];
UIScrollView *scroller=[viewer.subviews objectAtIndex: 0];
if (scroller) {
scroller.alwaysBounceVertical=NO;
scroller.bounces=NO;
scroller.scrollEnabled=NO;
}
[self viewHomePage];
//[self createCoverFlowView];
[self createPopView];
//[self setHomeButtonPosition];
//[self setSettingButtonPosition];
#if __IPHONE_OS_VERSION_MIN_REQUIRED > 30000
UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[self.view addGestureRecognizer:longPress];
longPress.minimumPressDuration=2.0;
longPress.delegate = self;
longPress.cancelsTouchesInView = NO;
longPress.allowableMovement=20;
[longPress release];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
singleTap.delegate = self;
singleTap.cancelsTouchesInView = NO;
[singleTap release];
#endif
//[viewer setOpaque:YES]; //透明
[super viewDidLoad];
}
source d'informationauteur user424714
Vous devez vous connecter pour publier un commentaire.
J'ai passé deux jours à essayer de suivre ce problème, comme j'ai eu exactement le même problème. J'ai trouvé que mon point de vue, si elle a débuté en mode Portrait correctement redimensionner Paysage. Mais, si j'ai commencé le point de vue en mode Paysage, il serait de garder la même taille dans le Portrait.
Si votre vue est la totalité de la largeur de l'appareil, tout en ajoutant la balise meta suivante fonctionnera.
Mais, dans mon cas, notre UIWebView est d'une taille non standard. Réglage de la fenêtre d'affichage pour
device-width
tout à fait, c'est encore pire! J'ai été en mesure d'avoir tout fonctionne correctement par le réglage de la fenêtre d'affichage de façon dynamique à l'aide de javascript. Cela devrait être fait au cours de la UIWebViews parent de la vue layoutSubviews. Vous pouvez le faire dans le willRotateToInterfaceOrientation, mais j'ai trouvé que si vous le faites dans willRotate certains de la taille et des interfaces peut ne pas être configuré correctement. Essayer là d'abord et voir comment les oeuvres d'animation.Le code définit la taille de la fenêtre à l'image actuelle de la taille. Le code HTML que vous affichez doit avoir un
meta viewport
tag déjà (comme ci-dessus). Si vous ne pouvez pas modifier le code HTML, il y a d'autres façons d'ajouter via javascript. La méthode la plus simple consiste tout simplement à ajouter dans la balise meta dans le<head>
tag. Ensuite, utilisez le code suivant, APRÈS avoir défini le cadre correctement:Vous pouvez ajouter d'autres fenêtre d'affichage des articles si vous ne voulez pas que l'utilisateur de l'échelle, ou vous souhaitez définir l'échelle max. Cela a fini par faire de la vue se comporter correctement pour notre UIWebView.
J'ai un problème similaire et ne peut toujours pas trouver de réelle solution à ce. J'appelle recharger sur UIWebView pour contourner le problème, en ayant les échelles de la page pour aller sur.
Juste de donner un headsup si d'autres personnes ont le même problème.
La webview l'habitude de redimensionner correctement parce que le HTML est déjà rendu (iam ne sais pas si c'est totalement vrai, peut-être juste un bug dans la webview itselfs), mais de toute façon. J'ai fait une méthode qui redimensionne le webview html largeur du corps:
Cela semble fonctionner très bien sur l'iphone, mais sur l'ipad j'ai eu à faire ce
Vous pourriez également avoir utilisé [self.webview recharger] mais ce serait faire une autre demande pour le serveur, et je pense que c'est mal 😉
J'espère que cela aide!
Je upvoted @christophercotton de réponse depuis, il a travaillé. Mais j'ai aussi trouvé que je pouvais résoudre un problème similaire à ce, sans contrôle de la webview objet. Sa solution m'a mis sur la piste pour mon problème.
Cela fonctionne sous iOS. Ne l'ai pas essayé sur android (pour ceux qui utilisent les goûts de PhoneGap).
J'ai également le problème de la UIWebView contenu non dimensionnement correctement lors de la commutation du mode paysage au mode portrait.
Après la chasse autour pendant un certain temps, j'ai trouvé ma réponse:
"D'une façon que j'ai trouvé pour résoudre ce problème est de recharger le contenu après le redimensionnement. Quand je dis "recharger" je ne veux pas intégré dans la fonction reload sur UIWebView, je veux dire de l'appel à loadHTMLString: baseURL: (ou quelle que soit la méthode que vous utilisez pour charger votre contenu initialement)." Agent d'Or du post sur le forum de Support d'Apple
J'ai juste eu le même problème.
La solution qui a fonctionné pour moi a été de définir:
J'ai essayé Christoper réponsela traduction de ses OOC code Swift, mais pas de travail.
Enfin, je dois faire le
UIWebView
recharger la page si la taille de l'écran a changé. Il pourrait être un hack, mais fonctionne de toute façon. Souhaitons que cette réponse pourrait aider Swift développeurs plus ou moins. La fonction ci-dessous appartient à votreUIViewController
.