Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Mobile Safari에서 아이폰 회전 이벤트 다루기

iPhone뿐만아니라 최근의 스마트폰들에서는 모두 중력계를 가지고 있어서 세로로 보기와 가로로 볼때 자동으로 화면이 전환이 됩니다. 사용자 입장에선 무척 편리하죠. 하지만 세로/가로 모드에서 해상도가 달라지기 때문에 보는 모드에 따라서 처리를 해주어야 할 필요가 있습니다. 왠지 있을것 같기는 했지만 하드웨어에서 발생시키는 이벤트라 좀 긴가민가했는데 찾아보니 있더군요.

보통은 Rotate라고 부르는 아이폰의 기기를 회전시키는 것은 Orientaion이라고 부르는데 Mobile Safari에서는 Oeientaion에 대한 이벤트를 지원하고 있었고 iPhone OS 1.1.1이후부터 orientationchange라는 이벤트명으로 지원하고 있었습니다.


function updateOrientation()
{
    switch(window.orientation)
    {
        case 0:
            alert("0");
            break;
        case -90:
            alert("-90");
            break;
        case 90:
            alert("90");
            break;
        case 180:
            alert("180");
            break;
    }
}

window.onload = function() {
    document.body.onorientationchange = updateOrientation;
}

위와같이 처리하면 orientation에 대한 이벤트를 처리할 수 있습니다. Safari의 레퍼런스문서에서는 <body>태그에 인라인으로 이벤트를 정의했지만 요즘은 보통 이벤트처리를 HTML에서 분리해서 하기 때문에 위와같이 처리했습니다. onload될때 body의 onorientationchange이벤트에 updateOrientation라는 함수를 리스너로 지정해 준것입니다. 이렇게 하면 orientaion의 변화가 있을때마다 함수가 호출되고 window.orientation의 값을 통해 현재 어느정도 회전된 상태인지를 확인할 수 있습니다. onorientationchange는 window에  등록해도 되지만 여기서는 body에 걸었습니다.

레퍼런스 문서에도 세로로 뒤집은 180에 대한 값이 나타나있는데 이상하게 저의 iPod Touch에서는 180에 대한 이벤트는 발생하지 않았습니다.(아이폰에서는 어떤지 잘 모르겠네요.) 실제로도 세로로 뒤집는다고 모바일 사파리가 뒤집어 지지는 않죠.
 


추가로 테스트를 해보니 넥서스원의 Android 2.1에서는 onorientationchange이벤트가 지원되지 않고 있었습니다. 안드로이드에서는 별수 없이 resize를 사용해야 합니다.


if ("onorientationchange" in window) {
    document.body.onorientationchange = updateOrientation;
} else {
    window.onresize = updateOrientation;
}

onorientationchange를 검사해서 있으면 사용하고 아니면 resize이벤트로 사용하면 됩니다. 양쪽다 resize로 사용해도 가능하긴 하지만 지원되는 이벤트가 있으면 사용하는게 맞을듯합니다. 그리고 사실 안드로이드에서는 resize에 걸었기 때문에 회전시키지 않아도 중간중간 위의 이벤트가 실행되기는 합니다 ㅡㅡ;;
2010/05/04 03:40 2010/05/04 03:40