<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    TWaver - 專注UI技術

    http://twaver.servasoft.com/
    posts - 171, comments - 191, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Make an TWaver HTML5 iPhone App

    Posted on 2012-03-10 23:36 TWaver 閱讀(1830) 評論(2)  編輯  收藏
    構建iOS App有很多技術方式可以選擇,本文介紹基于UIWebView的Cocoa Touch組件嵌入HTML頁面的方式實現的一個iPhone
    App例子。文中將穿插iOS的基本內容,TWaver HTML5的基礎應用,以及Objective C與Javascript相互調用的技術點。


    首先通過XCode構建個Empty Application即可


    創建一個UIViewController子類我命名為MainViewController,然后再xib可視化拖拽出如下界面,其中包含一個UISwitch開關,一個UISlider拉條,一個UITextField輸入框,以及一個最重要的UIWebView組件。

    該例子中UISwitch用于自動布局的開關,UISlider作為network拓樸圖的縮放控制,UITextField作為圖元label的編輯更新,UIWebView用于加載TWaver HTML5的拓撲組件

    接下來將twaver.js和demo.html的頁面內容drag添加進入項目,形成如下目錄結構的工程。這里細心的同學以及發現這行代碼<meta name = “viewport” content = “user-scalable=no, width = 500″></meta>,這個例子我希望讓拓撲自己控制縮放,所以關閉了瀏覽器的scalable功能并設定了寬度,更多的viewport知識可以參考這里


    這時需要我們做個設置,XCode默認將js作為Source而不是Resource處理,所以會導致找不到js資源的問題,可以在XCode的Build
    Phases
    里面將twaver.js從Compile Sources干掉,在Copy Bundle Resources里面加入twaver.js


    以下代碼再界面呈現時通過UIWebView的loadRequest函數加載指向demo.html的NSURLRequest,注意其中對textfield的添加的個空函數是為了回車能取消編輯,最后的becomeFirstResponder是為了能接收到Shake手勢,該例子中通過選中圖元搖晃手機可以彈出編輯告警界面。

     1-(void)viewDidAppear:(BOOL)animated
     2{
     3[self.webView setDelegate:self];
     4[self.webView setScalesPageToFit: YES];
     5NSURL *url = [[NSBundle mainBundle] URLForResource:@"demo" withExtension:@"html"];
     6NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
     7[self.webView loadRequest:req];
     8
     9[self.textField addTarget:nil action:@selector(dummy:)
    10forControlEvents:UIControlEventEditingDidEndOnExit];
    11
    12[self becomeFirstResponder];
    13}


    以下是Switch開關控制html頁面內javascript代碼,Objective C調用Javascript比較容易,直接調用stringByEvaluatingJavaScriptFromString運行即可

    1- (IBAction)handleSwitchChange:(id)sender {
    2    if(self.switcher.on){
    3        [self.webView stringByEvaluatingJavaScriptFromString: @"window.springLayouter.start();"];
    4    }
    else{
    5        [self.webView stringByEvaluatingJavaScriptFromString: @"window.springLayouter.stop();"];
    6    }

    7}


     

    如果javascript函數有返回值,則即是stringByEvaluatingJavaScriptFromString函數的返回值,以下代碼就是通過這種方式來獲取network當前的zoom值,以及當前選中圖元的名字信息

    1-(void) updateSlider{
    2    NSString* zoom = [self.webView stringByEvaluatingJavaScriptFromString: @"window.network.getZoom();"];
    3    self.slider.value = [zoom floatValue];
    4}

    5-(void) updateTextField{
    6    NSString* name = [self.webView stringByEvaluatingJavaScriptFromString: @"window.getCurrentName();"];
    7    self.textField.text = name;
    8}

    Javascript沒有直接調用Objective C的函數,我們只能通過改變頁面location的方式,在UIWebView的UIWebViewDelegate中攔截shouldStartLoadWithRequest函數回調來實現Javascript主動調用Objective C代碼。實際還不是那么完美,建議讀下這篇文章,我現在才有的也是文章建議的再建立一個iFrame方式去改變location避免一些副作用,以下是相關的代碼,邏輯很簡單我就不解釋了。

    1- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    2 NSString* url = [[request URL] absoluteString];
    3 if([url hasPrefix:@"call:" ]){
    4 NSArray *array = [url componentsSeparatedByString:@":"];
    5 NSString *method = [array objectAtIndex:1];
    6 [self performSelector:NSSelectorFromString(method)];
    7 return NO;
    8 }

    9 return YES;
    10}

     

     1var iframe = document.createElement("IFRAME");
     2
     3network.addPropertyChangeListener(function(e){
     4    if(e.property === 'zoom'){
     5        iframe.setAttribute("src""call:updateSlider");
     6        document.body.appendChild(iframe);
     7        iframe.parentNode.removeChild(iframe);
     8    }

     9}
    );                 
    10
    11box.getSelectionModel().addSelectionChangeListener(function(e){
    12    iframe.setAttribute("src""call:updateTextField");
    13    document.body.appendChild(iframe);
    14    iframe.parentNode.removeChild(iframe);
    15}
    );

     

    最后為了讓跟隨我四年多的已無法升級到iOS5的itouch繼續發揮余熱,還得做如下一些設置才能用于調試測試,首先Summary里面的Deployment
    Target
    需要設置到4.*的版本,plist文件中刪除Required device capabilities這行設置,最后在Architectures內改成armv7和armv6

    最后是兩個比較重要的obc和js代碼文件供大家參考TWaver HTML5 Demo

    最后將程序Archive歸檔發布到了App Store等著Apple的“審判”,如果順利的話過幾天大家就可以在App Store上通過查找到“TWaver”關鍵字,下載玩玩這篇文章的App,最后當然是free的App了。


    評論

    # re: Make an TWaver HTML5 iPhone App  回復  更多評論   

    2012-03-11 13:06 by lockron
    學到很多,感謝博主

    # re: Make an TWaver HTML5 iPhone App  回復  更多評論   

    2012-03-12 09:20 by tb
    呵呵 不錯啊

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲中文无码永久免| 亚洲国产综合精品中文字幕| 亚洲阿v天堂在线2017免费 | 亚洲国语在线视频手机在线| 国产成人无码a区在线观看视频免费| 成全视频免费观看在线看| 免费观看国产小粉嫩喷水| 亚洲欧洲另类春色校园网站| 亚洲精品成a人在线观看| 在线日韩av永久免费观看| 免费视频爱爱太爽了| 日韩免费无码视频一区二区三区| 亚洲综合精品网站| 色欲A∨无码蜜臀AV免费播| 99久久成人国产精品免费| 国产亚洲午夜高清国产拍精品| 毛片a级毛片免费观看品善网| 无码天堂亚洲国产AV| 亚洲中文字幕无码久久| 亚洲老熟女五十路老熟女bbw| 国产成人精品免费视频软件| 日本一道在线日本一道高清不卡免费| 精品久久8x国产免费观看| 久久久久久国产a免费观看黄色大片 | 午夜爽爽爽男女免费观看影院| 国产精品综合专区中文字幕免费播放| 五月天婷婷免费视频| 中文字幕在线免费播放| 久久这里只精品国产免费10| 中国人xxxxx69免费视频| 美女被免费网站视频在线| 久久久免费观成人影院| 免费福利在线视频| 一级毛片免费观看不收费| 中文字幕在线视频免费观看| 四虎1515hh永久久免费| 亚洲不卡无码av中文字幕| 亚洲五月激情综合图片区| 亚洲精品无码日韩国产不卡av| 一二三四在线观看免费中文在线观看| 在线观看免费无码专区|