iPad不会触发从垂直到水平的调整大小事件?

Posted

技术标签:

【中文标题】iPad不会触发从垂直到水平的调整大小事件?【英文标题】:iPad doesn't trigger resize event going from vertical to horizontal? 【发布时间】:2011-02-14 00:19:39 【问题描述】:

有没有人注意到这种行为?我正在尝试编写一个在调整大小时触发的脚本。它在普通浏览器上运行良好,在 iPhone 上运行良好,但在 iPad 上,只会触发从水平视口到垂直视口,反之亦然。

代码如下:

$(window).resize( function() 

    var agent=navigator.userAgent.toLowerCase();
    var is_iphone = ((agent.indexOf('iphone') != -1));
    var is_ipad = ((agent.indexOf('ipad') != -1));

    if(is_iphone || is_ipad)
        location.reload(true);
     else      
        /* Do stuff. */
    ;
);

【问题讨论】:

添加标签 webapp 或 iphone-web ? 【参考方案1】:

如果我对您的理解正确,您想在用户倾斜 iPad 时做一些事情。给你:

window.onorientationchange = function()

    var orientation = window.orientation;

    // Look at the value of window.orientation:

    if (orientation === 0)

        // iPad is in Portrait mode.

    

    else if (orientation === 90)

        // iPad is in Landscape mode. The screen is turned to the left.

    


    else if (orientation === -90)

        // iPad is in Landscape mode. The screen is turned to the right.

    


【讨论】:

我选择了您的答案,因为它是最简洁的正确答案。不过,作为一个符号点,我采用的解决方案没有包含任何if 检查。当方向改变时,它只是运行代码(即页面重新加载)。 @dclowd9901 是的,我想是的,我只是想提供一些额外的信息:) 你忘记了orientation === 180。就是当 iPad 上下颠倒的时候。 7 年后,这个答案仍然拯救了我。非常感谢。 值得注意的是 onorientationchange 事件是在屏幕尺寸实际改变之前触发的,所以如果你打印出高度/宽度,你会得到你刚刚离开的方向的数字。跨度> 【参考方案2】:

我想你想要的是使用iPad Orientation CSS,它看起来像这样:

<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css" />
<link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css" />

此外,根据iPad web development tips,当方向改变时会触发orientationchange 事件。

总之,这应该为您提供足够的工具来应对变化。

【讨论】:

我还不能测试这个,但这可能正是我正在寻找的。通用 iPad 开发的通用资源。提前感谢artlung!我期待着尝试一下! 酷!希望它有帮助。我有一个朋友刚买了一个,很想玩。 这似乎不起作用。 Safari 浏览器似乎无法识别 orientationchange 属性。 我没有 iPad 或 iPhone 可供测试。那是你要测试的地方吗? @dclowd: window.**on**orientationchange.【参考方案3】:

这包括所有方向。

这里有两个选项:

window.onorientationchange = function() 

    var orientation = window.orientation;

    // Look at the value of window.orientation:

    if (orientation === 0) 
    // iPad is in Portrait mode.

     else if (orientation === 90) 
     // iPad is in Landscape mode. The screen is turned to the left.

     else if (orientation === -90) 
     // iPad is in Landscape mode. The screen is turned to the right.

     else if (orientation === 180) 
    // Upside down portrait.

    
    

// Checks to see if the platform is strictly equal to iPad:
    if(navigator.platform === 'iPad') 
            window.onorientationchange = function() 

            var orientation = window.orientation;

            // Look at the value of window.orientation:

            if (orientation === 0) 
            // iPad is in Portrait mode.

             else if (orientation === 90) 
             // iPad is in Landscape mode. The screen is turned to the left.

             else if (orientation === -90) 
             // iPad is in Landscape mode. The screen is turned to the right.

             else if (orientation === 180) 
            // Upside down portrait.

            
                 
        

【讨论】:

【参考方案4】:

The only thing I could find from apple:

iPad 上的 Safari 和 iPhone 上的 Safari 没有可调整大小的窗口。在 iPhone 和 iPad 上的 Safari 中,窗口大小设置为屏幕大小(减去 Safari 用户界面控件),用户无法更改。要在网页中移动,用户可以通过双击或捏合来放大或缩小,或者通过触摸和拖动来平移页面来更改视口的缩放级别和位置。当用户更改视口的缩放级别和位置时,他们是在固定大小的可视内容区域(即窗口)内进行的。这意味着其位置“固定”到视口的网页元素最终可能会出现在可视内容区域之外,即屏幕外。

我了解“适用于 iPhone”的部分......但也许它不再适用了?这可能是 OS/移动 Safari 的变化,因为最新的公共 iPhone OS 版本发布(上述文档来自 2010 年 3 月)。

我将重新标记这个问题,将 iPhone 添加到它,也许开发者 4.0 操作系统版本的其中一位可以测试这个?如果是这种情况,它已被删除,这应该是在它上线之前提交/修复的错误......不过,我不确定 Apple 的程序如何。

【讨论】:

感谢您查找并添加标签。让我更加困惑的是,我不是 javascript 禅宗大师,所以我什至不确定我是否将代码正确地组合在一起。 @dclowd9901 - 代码看起来不错,只是在if 后面多了一个; :) 很好奇,为什么页面调整大小时需要重新加载? 我编写的幻灯片插件中有一个功能,可以通过参数进行全屏查看。用户提请我注意,缺乏适应的窗口调整大小是一个疏忽。在发布新的测试版本之前,我试图写一个创可贴,但遇到了我发布的问题。【参考方案5】:

您希望对 iphone 和 ipad 上的方向错误进行此修复。 在这里阅读: http://www.blog.highub.com/mobile-2/a-fix-for-iphone-viewport-scale-bug/

github 最新版本在这里: https://gist.github.com/901295 使用页面上的第二个版本。

【讨论】:

【参考方案6】:

检查您的 ios 版本。

“orientationchange”事件在 iOS 3.* 中不起作用,但在 4.* 中起作用

【讨论】:

【参考方案7】:
    好好检查一下你的平台是不是 iPad,

    通过捕获 window.onorientationchange 来处理 iOS 特定事件orientationchange

    if(navigator.platform == 'iPad') 
        window.onorientationchange = function() 
            // handle orientationchange event
            // (here you can take advantage of the orientation property
            //     - see the good answer above by Vincent)
               
    
    

【讨论】:

我认为最好先检查window.orientation,然后在大多数情况下明确检查设备。

以上是关于iPad不会触发从垂直到水平的调整大小事件?的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout:垂直到水平,没有明确的尺寸?

嵌套在水平 StackLayout 中时,多行标签不会调整父 StackLayout 的大小

调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?

在 Qt 表单的不同布局中调整按钮大小

调整大小以适合 div 中的图像,并水平和垂直居中

图像 <a> 垂直和水平对齐中心并在两者中都使用 % 调整大小