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

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

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

    TWaver - 專(zhuān)注UI技術(shù)

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

    Make an TWaver HTML5 iPhone App

    Posted on 2012-03-10 23:36 TWaver 閱讀(1822) 評(píng)論(2)  編輯  收藏
    構(gòu)建iOS App有很多技術(shù)方式可以選擇,本文介紹基于UIWebView的Cocoa Touch組件嵌入HTML頁(yè)面的方式實(shí)現(xiàn)的一個(gè)iPhone
    App例子。文中將穿插iOS的基本內(nèi)容,TWaver HTML5的基礎(chǔ)應(yīng)用,以及Objective C與Javascript相互調(diào)用的技術(shù)點(diǎn)。


    首先通過(guò)XCode構(gòu)建個(gè)Empty Application即可


    創(chuàng)建一個(gè)UIViewController子類(lèi)我命名為MainViewController,然后再xib可視化拖拽出如下界面,其中包含一個(gè)UISwitch開(kāi)關(guān),一個(gè)UISlider拉條,一個(gè)UITextField輸入框,以及一個(gè)最重要的UIWebView組件。

    該例子中UISwitch用于自動(dòng)布局的開(kāi)關(guān),UISlider作為network拓樸圖的縮放控制,UITextField作為圖元label的編輯更新,UIWebView用于加載TWaver HTML5的拓?fù)浣M件

    接下來(lái)將twaver.js和demo.html的頁(yè)面內(nèi)容drag添加進(jìn)入項(xiàng)目,形成如下目錄結(jié)構(gòu)的工程。這里細(xì)心的同學(xué)以及發(fā)現(xiàn)這行代碼<meta name = “viewport” content = “user-scalable=no, width = 500″></meta>,這個(gè)例子我希望讓拓?fù)渥约嚎刂瓶s放,所以關(guān)閉了瀏覽器的scalable功能并設(shè)定了寬度,更多的viewport知識(shí)可以參考這里


    這時(shí)需要我們做個(gè)設(shè)置,XCode默認(rèn)將js作為Source而不是Resource處理,所以會(huì)導(dǎo)致找不到j(luò)s資源的問(wèn)題,可以在XCode的Build
    Phases
    里面將twaver.js從Compile Sources干掉,在Copy Bundle Resources里面加入twaver.js


    以下代碼再界面呈現(xiàn)時(shí)通過(guò)UIWebView的loadRequest函數(shù)加載指向demo.html的NSURLRequest,注意其中對(duì)textfield的添加的個(gè)空函數(shù)是為了回車(chē)能取消編輯,最后的becomeFirstResponder是為了能接收到Shake手勢(shì),該例子中通過(guò)選中圖元搖晃手機(jī)可以彈出編輯告警界面。

     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開(kāi)關(guān)控制html頁(yè)面內(nèi)javascript代碼,Objective C調(diào)用Javascript比較容易,直接調(diào)用stringByEvaluatingJavaScriptFromString運(yùn)行即可

    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函數(shù)有返回值,則即是stringByEvaluatingJavaScriptFromString函數(shù)的返回值,以下代碼就是通過(guò)這種方式來(lái)獲取network當(dāng)前的zoom值,以及當(dāng)前選中圖元的名字信息

    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沒(méi)有直接調(diào)用Objective C的函數(shù),我們只能通過(guò)改變頁(yè)面location的方式,在UIWebView的UIWebViewDelegate中攔截shouldStartLoadWithRequest函數(shù)回調(diào)來(lái)實(shí)現(xiàn)Javascript主動(dòng)調(diào)用Objective C代碼。實(shí)際還不是那么完美,建議讀下這篇文章,我現(xiàn)在才有的也是文章建議的再建立一個(gè)iFrame方式去改變location避免一些副作用,以下是相關(guān)的代碼,邏輯很簡(jiǎn)單我就不解釋了。

    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}
    );

     

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

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

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


    評(píng)論

    # re: Make an TWaver HTML5 iPhone App  回復(fù)  更多評(píng)論   

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

    # re: Make an TWaver HTML5 iPhone App  回復(fù)  更多評(píng)論   

    2012-03-12 09:20 by tb
    呵呵 不錯(cuò)啊

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品乱码久久久久久V| 精品无码国产污污污免费网站| 香蕉蕉亚亚洲aav综合| 日本人护士免费xxxx视频| 99国产精品免费观看视频| 色播在线永久免费视频网站| 一个人看的hd免费视频| 黄页免费视频播放在线播放| 真人无码作爱免费视频| 精品久久久久久亚洲中文字幕| 亚洲av无码成人精品区一本二本| 亚洲综合一区国产精品| 亚洲狠狠婷婷综合久久| 亚洲AV无码专区在线观看成人| 亚洲JIZZJIZZ妇女| 黄床大片30分钟免费看| 九九免费观看全部免费视频| 一级毛片免费一级直接观看| japanese色国产在线看免费| igao激情在线视频免费| 免费看黄的成人APP| 中文字幕日本人妻久久久免费| 国内精品久久久久影院免费| 免费精品无码AV片在线观看| 18禁黄网站禁片免费观看不卡| 在线观看视频免费完整版| 韩国免费三片在线视频| 全黄性性激高免费视频| 相泽亚洲一区中文字幕| 亚洲AV午夜成人影院老师机影院| 亚洲国产精品久久久久| 亚洲人成电影院在线观看| 亚洲经典在线观看| 亚洲人成色99999在线观看| 鲁死你资源站亚洲av| ww在线观视频免费观看w| 成人电影在线免费观看| 成人免费观看一区二区| 日本不卡在线观看免费v| 久久亚洲国产成人影院网站 | www一区二区www免费|