iPhone Safari автоматически не уменьшает портрет -> пейзаж-> портрет - PullRequest
35 голосов
/ 06 апреля 2010

У меня есть очень простая HTML-страница с этим метатегом для iPhone:

<meta name="viewport" content="height=device-height,width=device-width,initial-scale=1.0,user-scalable=no" />

При использовании iPhone Safari, когда страница загружается в портретном режиме, она выглядит хорошо и ширина соответствует экрану. Когда я поворачиваю iPhone в альбомный режим, веб-страница автоматически изменяется в соответствии с шириной ландшафта. Хорошо, это то, что я хочу.

Но когда я поворачиваю назад из пейзажа, размер страницы не изменяется, чтобы соответствовать ширине портрета, как это было раньше. Остается в ширине ландшафта.

Я хочу, чтобы iPhone автоматически установил правильную ширину, как в ландшафтном режиме. Я не думаю, что это должно включать слушателей ориентации, потому что все это делается автоматически, и у меня нет специальных стилей для различных режимов.

Почему iPhone не изменяет размер веб-страницы в портретном режиме? Как мне это исправить?

UPDATE

Мне удалось настроить iPhone на автоматическое изменение размера, но с таким странным явлением, как только после четного числа поворотов ... Я использую этот метатег:

<meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

Вот что мне нужно сделать, чтобы автоматически изменить его размер:
1. На нагрузке в портретном -> хорошо выглядит.
2. Поверните в альбомную ориентацию -> измените размер по размеру экрана.
3. Поверните назад к портрету -> без изменения размера назад.
4. Поверните в альбомную ориентацию -> все еще в размере для альбомной ориентации.
5. Поверните в портретную ориентацию -> измените размер, чтобы соответствовать портретному экрану.

Может кто-нибудь объяснить это поведение ??
Я все еще хочу знать, как это исправить, и ценю любую помощь.

Спасибо!
Том.

Ответы [ 11 ]

31 голосов
/ 29 сентября 2010

Это должно быть ошибкой в ​​iOS 4 Safari. Вот как я поступил со следующими мета-тегами (второй тег, чтобы сделать его полноэкранным):

<meta name="viewport" content="user-scalable=no, width=device-width"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>

Страница будет корректно масштабироваться при переходе от портрета к ландшафту, пока я не воспользуюсь всплывающей клавиатурой для ввода значения в поле - тогда она остановит масштабирование. Что означало бы, что если бы я использовал клавиатуру в альбомной ориентации, она была бы слишком большой, когда я перешел в портретную ориентацию, или наоборот.

Переключение с использованием следующих метатегов исправило это ... Благодаря другим ответам на этой странице.

<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=device-width"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
4 голосов
/ 04 мая 2010

У меня была такая же проблема на моем 3GS 3.1.3, хотя я не мог заставить его когда-либо снова стать нужного размера после ландшафтного режима. Но когда я убрал «height = device-height», страница каждый раз корректно уменьшалась. Итак, моя мета выглядит так:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

Я бы хотел использовать атрибут высоты, чтобы зафиксировать высоту, но похоже, что они не слишком хорошо смешиваются.

3 голосов
/ 19 сентября 2011

Вам нужно поставить еще одну вещь minimum-scale=1.0 так, как она бы хотела:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0" />
2 голосов
/ 20 июля 2010

Я использую ExtJs (sencha touch), кажется, Хорошо

Ext.setup({
  tabletStartupScreen: 'images/tablet_startup_768x1004.png',
  phoneStartupScreen: 'images/phone_startup_320x460.png',
  tabletIcon: 'images/tablet_icon_72x72.png',
  phoneIcon: 'images/phone_icon_72x72.png',
  icon: 'images/icon_72x72.png',
  statusBarStyle: 'black',
  glossOnIcon: true,
  fullscreen: true,
  onReady: function() {
    var viewport = null;                                                                                
    var metas = document.getElementsByTagName('meta');                                                  
    for(var i = 0, length = metas.length; i < length; ++i){                                             
      var meta = metas[i];                                                                              
      // already Extjs addedMetaTags                                                                    
      if(meta.name == 'viewport'){                                                                      
        viewport = Ext.get(meta);                                                                       
        break;                                                                                          
      }                                                                                                 
    }                                                                                                   
    if(null == viewport){                                                                               
      viewport = Ext.get(document.createElement('meta'));                                               
    }                                                                                                   

    if(window.navigator.standalone){                                                                    
      // IMPORTANT!!! not set to height=device-height when iphone standalone mode was ignored "scale" settings           
      viewport.set({                                                                                    
        name: 'viewport',                                                                               
        content: 'width=device-width, initial-scale=0.1, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'
      });                                                                                               
    } else {                                                                                            
      // IMPORTANT!!! set to height=device-height when !standalone mode; behav window.innerHeight = fullscreen size
      viewport.set({                                                                                    
        name: 'viewport',                                                                               
        content: 'height=device-height, width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'
      });                                                                                               
    } 
  }
});

другие устройства, совместимые с ...

var watcher = {
  handlers: [],
  dimentions: {width:0, height: 0},
  fullscreenize: false,
  orientLandscape: function (){
    return 90 === Math.abs(window.orientation);
  },
  orientPortrait: function (){
    return !this.orientLandscape();
  },
  width: function (){
    return this.dimentions.width;
  },
  height: function (){
    return this.dimentions.height;
  },
  changeDimentions: function (evt){
    var self = this;
    (function (){
      if(self.fullscreenize){
        window.scrollTo(0, 1);
      }

      self.dimentions = Ext.Element.getViewSize();
      self.fireOnchange();
    }).defer(100);
  },
  init: function (){
    if('onorientationchange' in window){
      Event.observe(window, 'orientationchange', this.changeDimentions.bind(this));
    } else {
      Event.observe(window, 'resize', this.changeDimentions.bind(this));
    }
    Event.observe(window, 'load', this.changeDimentions.bind(this));
  },
  fullScreen: function (){
    this.fullscreenize = true;
    var self = this;
    document.observe('dom:loaded', function (){
      (function (){
        window.scrollTo(0, 1);

        self.changeDimentions();
      }).defer(100);
    });
  },
  fireOnchange: function(){
    var self = this;
    self.handlers.each(function (handler){
      handler.apply(null, [self]);
    });
  },
  onchange: function (handler){
    this.handlers.push(handler);
  }
};
watcher.init();
watcher.fullScreen();

aComponent = Ext.extend(Ext.Component, {
  initComponent: function (){
    watcher.onchange(this.fullscreen.bind(this));
  },
  fullscreen: function (){
    var height = watcher.height();
    var width = watcher.width();

    this.menu.setHeight(40);
    this.mainPanel.onResize(height - 40, width);
  }
});
1 голос
/ 28 сентября 2011

Просто установите директиву области просмотра на ...

<meta name="viewport" content="height=device-height, width=device-width, minimum-scale=1.0, user-scalable=yes|no" />

... нет необходимости использовать JavaScript, и вы все равно можете позволить пользователю масштабировать страницу, если он пожелает.

1 голос
/ 15 сентября 2011

попробуйте <meta name="viewport" content="width=1024" />

1 голос
/ 02 июля 2010

Я также столкнулся с проблемой «не уменьшать масштаб, когда вернулся к портрету».

У меня это работает с

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.6, user-scalable=no" />

для базового масштабирования вперед и назад, в 3G с iOS 4, когда я меняю ориентацию.

Первоначально я использовал «минимальный масштаб = 1,0», заставил его работать, когда я заменил его на «начальный масштаб = 1,0», после того как увидел предложения здесь.

0 голосов
/ 17 мая 2013

Мы столкнулись с той же проблемой в JQuery Mobile 1.3.0, мы использовали приведенное ниже, и это сработало

в CSS

body { /* IOS page orientation change resize issue*/  
  -webkit-text-size-adjust: none ; 
}

и, если заголовок / нижний колонтитул все еще не изменяет размер правильно (необязательно)

$(window).resize(function() { 
   $("div[data-role=header]").width($(window).width());
   $("div[data-role=footer]").width($(window).width());
});
0 голосов
/ 13 февраля 2013

У меня была та же проблема с моим iPhone 5. Ответ был невероятно прост.

<meta name="viewport" content="width=device-width" />

Это правильно отображает страницу в любом представлении, всегда, и предлагает масштабируемость.

0 голосов
/ 29 августа 2012

Это ошибка в Safari на iOS 5 и ниже (ошибка масштабирования в A.K.A. Safari Viewport).

Старайтесь избегать исправлений с мета-тегами видового экрана, которые отключают жест масштабирования; вместо этого используйте это исправление JavaScript:
https://gist.github.com/901295

Больше информации об этой ошибке: http://webdesignerwall.com/tutorials/iphone-safari-viewport-scaling-bug

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...