29 votes

iPhone UIWebView ressources locales à l'aide de Javascript et gestion de l'orientationChanger

Je suis en train de serveur HTML, Javascript et CSS du contenu depuis un iPhone application sur les ressources locales, et je vais avoir de la difficulté à gérer onOrientationChange événements et y compris Javascript externe.

Je semble être en mesure de relier en CSS correctement, mais pas le javascript. Je suis en train d'utiliser l'exemple suivant de la manipulation onOrientationChange (Comment construire un iPhone site web), mais je suis de servir la page web à partir de mon application NSBundle mainBundle.

J'ai essayé d'attacher une fonction javascript pour le corps.onorientationchange et à la fenêtre.onorientationchange mais ni travail, lorsqu'il est servi à partir de UIWebView (localement ou à distance), mais cela fonctionne si j'utilise l'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>

47voto

Dougnukem Points 5346

La réponse peut être tracée à partir de l'avertissement que je recevais dans XCode:

avertissement: pas de règle pour traiter le fichier '$(PROJECT_DIR)/html/orientation.js " du type de code source.javascript pour l'architecture i386

XCode d'installation *.js javascript, comme certains le type de code source nécessaire pour être compilé dans l'application quand j'ai voulu l'inclure comme une ressource donc je l'ai résolu en faire 2 choses.

  1. Sélectionnez .fichier js et dans le "Détail" afficher désélectionner le point de mire de la colonne pour indiquer que c'est du code compilé
  2. Dans les "Groups & files" en vue d'étendre les "Cibles" de l'arbre et de développer l'application, puis cliquez sur "Copier le Bundle de Ressources" et faites glisser le *.js fichiers

Le dev Apple forums a posté la solution:

Il semble que vous êtes l'obtention de bits par Xcode pense que .js sont des choses pour être compilé" caractéristique. Fondamentalement, Xcode pense que le script doit d'une certaine manière d'être exécuté ou compile, de sorte que les marques de comme une partie du code source. Source code, bien sûr, n'est pas copié dans les ressources.

Si vous avez besoin de faire deux choses - sélectionnez l' .fichier js dans votre projet, et tourner désactiver la case à cocher qui indique que il est compilé (la "bulle" la colonne). Si vous ne le faites pas, vous aurez obtenez un avertissement dans votre journal de construction sur étant dans l'impossibilité de compiler le fichier (ce qui devrait être votre premier avertissement - toujours essayer de comprendre et de et de corriger tous les avertissements que apparaissent dans votre build).

Puis faites-le glisser et déposez-le dans la la cible de "Copier Bundle de Ressources".

24voto

Martijn Thé Points 1802

La réponse à votre deuxième problème de la onorientationchange gestionnaire n'est pas appelée dans UIWebView:

J'ai remarqué que la fenêtre.l'orientation de la propriété ne fonctionne pas correctement et la fenêtre.onorientationchange gestionnaire n'est pas appelé. La plupart des applications souffrent de ce problème. Ceci peut être corrigé par le réglage de la fenêtre.l'orientation de la propriété et de l'appel de la fenêtre.onorientationchange dans le willRotateToInterfaceOrientation méthode de la vue-contrôleur qui contient votre 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;
    }
}

6voto

Gabe Points 1563

Il vaut mieux utiliser

  • (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation

puisque safari appelle en fait orientationChange APRÈS que la vue a pivoté.

C'était important pour moi car j'avais besoin de redimensionner mes toiles HTML5 APRÈS que la page ait tourné et je savais la taille de son conteneur.

3voto

I.Iordanov Points 31

J'ai trouvé quelques informations supplémentaires pour utiliser UIWebView avec des ressources locales.

Je les ai rassemblés dans un petit blog. Si quelqu'un est intéressé, il existe un exemple de travail que vous pouvez télécharger.

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

2voto

D.S. Points 1207

J'ai trouvé l'iOS 4.2 n'a pas l'appui de la fenêtre.propriété orientation dans UIWebView, tandis que dans le navigateur safari mobile, il fonctionne... Donc, le seul moyen que j'ai trouvé afin de faire mon JS réagir aux changements d'orientation était de faire de mon code objective-c appel d'une fonction javascript définies dans actuellement affichée UIWebView page web. Voici un exemple de code, en remplaçant ViewController de didRotateFromInterfaceOrientation méthode:

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

Vous devez définir l'option Javascript de votre fonction comme suit:

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

Profitez-en! :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X