Подтвердить что ты не робот

IPhone UIWebView локальных ресурсов с использованием Javascript и обработки onorientationChange

Я пытаюсь передать HTML-содержимое Javascript и CSS из локальных ресурсов приложения iPhone, и у меня возникают проблемы с обработкой событийOrientationChange и в том числе с внешним Javascript.

Кажется, я могу правильно связать CSS, но не javascript. Я пытаюсь использовать следующий пример обработки onOrientationChange (Как создать сайт iPhone), но я обслуживаю веб-страницу из своего приложения NSBundle mainBundle.

Я попытался подключить функцию javascript к body.onorientationchange и к window.onorientationchange, но ни один из них не работает, если вы используете UIWebView локально (или удаленно), но он работает, если я использую iPhone Safari.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>How to build an iPhone website</title>

    <meta name="author" content="will" />
    <meta name="copyright" content="copyright 2008 www.engageinteractive.co.uk" />
    <meta name="description" content="Welcome to engege interactive on the iPhone!" />
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">
    <link rel="apple-touch-icon" href="images/template/engage.png"/>

    <style type="text/css">
        @import url("iphone.css");
    </style>
    <!--
    <script type="text/javascript" src="orientation.js"></script>
    -->
    <script type="text/javascript">


function updateOrientation(){
    try  {
        var contentType = "show_normal";
        switch(window.orientation){
            case 0:
                contentType = "show_normal";
                break;

            case -90:
                contentType = "show_right";
                break;

            case 90:
                contentType = "show_left";
                break;

            case 180:
                contentType = "show_flipped";
                break;
        }

        document.getElementById("page_wrapper").setAttribute("class", contentType);
        //alert('ORIENTATION: ' + contentType);
    }
    catch(e) {
        alert('ERROR:' + e.message);
    }
} 

window.onload = function initialLoad(){
    try {
        loaded();
        updateOrientation();
    }
    catch(e) {
        alert('ERROR:' + e.message);
    }
}

        function loaded() {
            document.getElementById("page_wrapper").style.visibility = "visible";

        }


    </script>

</head>

<body onorientationchange="updateOrientation();">

    <div id="page_wrapper">
        <h1>Engage Interactive</h1>
        <div id="content_left">
            <p>You are now holding your phone to the left</p>
        </div>
        <div id="content_right">
            <p>You are now holding your phone to the right</p>
        </div>
        <div id="content_normal">
            <p>You are now holding your phone upright</p>
        </div>
        <div id="content_flipped">
            <p>This doesn't work yet, but there is a chance apple will enable it at some point, so I've put it in anyway. You would be holding your phone upside down if it did work.</p>
        </div>
    </div>

</body>
</html>
4b9b3361

Ответ 1

Ответ можно проследить из предупреждения, которое я получал в XCode:

предупреждение: нет правила для обработки файла '$ (PROJECT_DIR)/html/orientation.js' типа sourcecode.javascript для архитектуры i386

Настройка XCode *.js javascript как некоторый тип исходного кода, который должен быть скомпилирован в приложении, когда я хотел включить его в качестве ресурса, поэтому решил его, выполнив две вещи.

  • Выберите файл .js и в представлении "Деталь" отмените выбор столбца bullseye, указав, что он скомпилирован.
  • В представлении "Группы и файлы" разверните дерево "Цели" и разверните приложение, затем перейдите в "Копировать ресурсы Bundle" и перетащите в него файлы *.js.

В форумах Apple dev есть решение:

Кажется, что вы получаете "Xcode считает, что .js - это вещи для компиляции". В принципе, Xcode считает, что script должен как-то запускаться или компилироваться, поэтому метки это как часть исходного кода. Источник код, конечно, не копируется в ресурсов.

Итак, вам нужно сделать две вещи - выберите файл .js в вашем проекте и установите флажок, который указывает, что он скомпилирован ( "яблочко" колонка). Если вы этого не сделаете, вы получить предупреждение в журнале сборки невозможность скомпилировать файл (это должно быть ваше первое предупреждение - всегда пытайтесь выяснить и исправить все предупреждения, что появятся в вашей сборке).

Затем перетащите его и опустите в target "Copy Bundle Resources".

Ответ 2

Ответ на вторую проблему обработчика onorientationchange, который не вызывается в UIWebView:

Я заметил, что свойство window.orientation не работает должным образом, и обработчик window.onorientationchange не вызван. Эта проблема вызывает большинство приложений. Это можно устранить, установив свойство window.orientation и вызывая window.onorientationchange в методе willRotateToInterfaceOrientation контроллера представления, который содержит ваш UIWebView:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    switch (toInterfaceOrientation)
    {
        case UIDeviceOrientationPortrait:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 0;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationLandscapeLeft:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 90;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationLandscapeRight:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return -90;});window.onorientationchange();"];
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            [webView stringByEvaluatingJavaScriptFromString:@"window.__defineGetter__('orientation',function(){return 180;});window.onorientationchange();"];
            break;
        default:
            break;
    }
}

Ответ 3

Лучше использовать

  • (аннулируются) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation

так как сафари на самом деле вызывает directionChange ПОСЛЕ поворота представления.

Это было важно для меня, потому что мне нужно было изменить размер моих холстов HTML5 ПОСЛЕ того, как страница повернулась, и я знал, насколько большой был контейнер.

Ответ 4

Я нашел дополнительную информацию для использования UIWebView с локальными ресурсами.

Я собрал их вместе в коротком блоге. Если кто-то заинтересован, есть рабочий пример, который вы можете скачать.

http://mentormate.com/blog/iphone-uiwebview-class-local-css-javascript-resources/

Ответ 5

Я нашел, что iOS 4.2 не поддерживает свойство window.orientation в UIWebView, в то время как в мобильном сафари это работает... Таким образом, единственный способ, которым я нашел, чтобы заставить JS реагировать на изменения ориентации, заключался в том, чтобы сделать мой код objective-c функцией javascript, определенной на текущей отображаемой веб-странице UIWebView. Здесь пример кода, переопределяющий метод ViewController didRotateFromInterfaceOrientation:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [webView stringByEvaluatingJavaScriptFromString:
          [NSString stringWithFormat:@"didRotateTo('%@')", 
            [self currentOrientationAsString]]];
}
- (NSString*) currentOrientationAsString {
    switch([[UIDevice currentDevice] orientation]) {
        case UIDeviceOrientationLandscapeLeft:
        case UIDeviceOrientationLandscapeRight:
            return @"landscape";
    }
    return @"portrait"; // assuming portrait is default
}

Вы должны определить свою функцию Javascript следующим образом:

function didRotateTo(ori) {
  if (ori=="portrait") {
    // ... do something
  } else {
    // ... do something else
  }
}

Наслаждайтесь!:)