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

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

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

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

    How to build an iPhone website       @import url("iphone.css");  <!--  -->  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"; }    

Engage Interactive

You are now holding your phone to the left

You are now holding your phone to the right

You are now holding your phone upright

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.

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

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

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

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

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

  • UIWebView и JavaScript

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

Поэтому вам нужно сделать две вещи: выберите файл .js в своем проекте и отключите флажок, который указывает, что он скомпилирован (столбец «bullseye»). Если вы этого не сделаете, вы получите предупреждение в журнале сборки о невозможности скомпилировать файл (это должно быть ваше первое предупреждение – всегда пытайтесь выяснить и исправить все предупреждения, которые появляются в вашей сборке ).

Затем перетащите его и отбросьте в целевую папку «Copy Bundle Resources».

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

Я заметил, что свойство window.orientation не работает должным образом, и обработчик window.onorientationchange не вызван. Эта проблема вызывает большинство приложений. Это можно устранить, установив свойство window.orientation и вызывая window.onorientationchange в методе willRotateToInterfaceOrientation controllerа представления, который содержит ваш 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; } } 

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

  • (Пустоты) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation

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

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

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

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

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

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

 - (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 } } 

Наслаждайтесь! 🙂

  • Получить текущий URL-адрес UIWebView
  • UIWebViewDelegate не контролирует XMLHttpRequest?
  • Кадр манифеста html5 в UIWebView?
  • Переход на WKWebView
  • UIWebView отправляет один и тот же User-Agent в заголовки запроса в качестве мобильного Safari?
  • Клавиатура не отображается при нажатии текстового поля в UIWebView
  • Возможно открытие всплывающих ссылок в UIWebView?
  • Возвратитесь к поведению приложения после разговора по телефону в собственном коде, чем UIWebView
  • iPhone Dev: UIWebView baseUrl для ресурсов в папке Documents not app bundle
  • Как вызвать Objective-C из Javascript?
  • UIWebView: когда страница действительно заканчивала загрузку?
  • Interesting Posts

    Зачем использовать @ Scripts.Render (“~ / bundles / jquery”)

    Какие недостатки существуют при использовании памяти, которая быстрее, чем у материнской платы?

    Две установки Windows 8 на отдельных жестких дисках – невозможность загрузки

    Какую аппаратную комбинацию я должен рассмотреть для файлового сервера 20 ТБ?

    java.lang.NoClassDefFoundError: javax / servlet / jsp / jstl / core / Config

    Neo4j Spatial ‘WithinDistance’ Запрос Cypher возвращается пустым, в то время как вызов REST возвращает данные

    Как поместить изображение в div с помощью CSS?

    междоменное изменение размера iframe?

    Как установить права доступа по умолчанию для ВСЕХ вновь созданных файлов в Linux

    Безопасность схем аутентификации REST

    В clang, как вы используете атрибуты оптимизации для каждой функции?

    Как отправлять и извлекать параметры с помощью $ state.go toParams и $ stateParams?

    tkinter TclError: файл чтения растровых изображений ошибок

    Как получить ТОЧНУЮ середину экрана, даже если размер

    Я считаю, что я удалил пользователя MySQL root, как его воссоздать?

    Давайте будем гением компьютера.