ios&h5混合開發項目仿app頁面跳轉最佳化

來源:互聯網
上載者:User

標籤:baidu   網頁開發   資料   vertica   利用   大致   使用者   dism   send   

前言:本人原本是ios開發工程師,但由於現今H5的興起,行內颳起了一陣混合開發的風氣,趁著這股勁,我也學了前端開發,不說研究的多深,但也能勝任日常的開發工作。長話短說,現今的混合開發應該還處於摸索階段,我們的項目主要頁面都是由網頁做的,只有一些IM、支付、分享、推送、上傳照片這些用的是原生功能,大家都知道ios原生app的體驗一直是很好的,現在改成了混合開發,無疑中就有些捨棄了ios原生的使用者體驗,而這個作為一個向來以使用者體驗為先的開發人員來說,這個真的是難以忍受,所以開始了以最佳化使用者體驗的為目標的各種嘗試。

最佳化頁面跳轉功能

app中的翻頁常用的分為兩類,一種通過導航,一種直接跳

1、第一種 直接跳轉 思路大致就是new一個目的頁面,然後設定下頁面跳轉動畫 中間還可以做點目的頁面的資料初始化:

 1 ValueInputView *valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView"bundle:[NSBundle mainBundle]]; 2  3 valueView.delegate = self; 4  5 [valueView setModalTransitionStyle:UIModalTransitionStyleCoverVertical]; 6  7 [self presentModalViewController:valueView animated:YES]; 8  9 //返回10 11 [self dismissModalViewControllerAnimated:YES];

 

2、利用UINavigationController,調用pushViewController,進行跳轉;這種採用壓棧和出棧的方式,進行Controller的管理。調用popViewControllerAnimated方法可以返回

PickImageViewController *ickImageViewController = [[PickImageViewController alloc] init];[self.navigationController pushViewController: ickImageViewController animated:true];

 


而我們在網頁中的跳轉就很直接,一個webview中轉換不同的URL,很明顯這樣的方法呈現給使用者的體驗很差,所以得想辦法去最佳化,最好的解決辦法就是去模仿原生的頁面跳轉。為此我查看了很多的知名app,但我發現大多數混合開發的app都只是某幾個頁面用的是網頁開發,然後再webview所在頁面加上進度條,所以給使用者感覺不是很突兀,比如餓了麼之類的。但這很明顯不適用於我們的APP,所以我當時想的是這樣做的,載入一個UIScrollView,然後在ScrollView上去添加webview,每點擊一次webview裡面的跳轉時,產生一個新的webview添加在第二屏的位置,以此類推每次進入新頁面都可以用這種方式。

//初始化頁面的操作-(void)initView{_scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 20, kWidth, kHeight-20)];_scrollView.backgroundColor = [UIColor whiteColor];_scrollView.contentSize = CGSizeMake(60*kWidth, kHeight);_scrollView.pagingEnabled = YES;_scrollView.scrollEnabled = NO;_scrollView.bounces = NO;//隱藏水平捲軸_scrollView.showsHorizontalScrollIndicator = NO;//隱藏垂直捲軸_scrollView.showsVerticalScrollIndicator = NO;_scrollView.contentOffset = CGPointMake(0, 0);//建立初始的WebView_myWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, kWidth, kHeight-20)];_myWebView.backgroundColor = [UIColor grayColor];//地址是我亂寫的NSString *urlString = @"http://www.baidu.com"NSURL *url = [NSURL URLWithString:urlString];NSURLRequest *request = [NSURLRequest requestWithURL:url];_myWebView.scrollView.bounces = NO;_myWebView.scalesPageToFit = NO;_myWebView.delegate = self;[_myWebView loadRequest:request];[self.scrollView addSubview:_myWebView];[self.view addSubview:_scrollView];//執行互動操作[self mutualOCwithJS];}

 

//進入下一頁-(void)nextWeb{//翻頁動效CGPoint offSet = self.scrollView.contentOffset;//在新頁面裡建立webviewUIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(offSet.x+kWidth, 0, kWidth, kHeight-20)];webView.backgroundColor = [UIColor grayColor];NSString *urlString = _urlWeb;NSURL *url = [NSURL URLWithString:urlString];_lastoffset = offSet.x;NSURLRequest *request = [NSURLRequest requestWithURL:url];webView.scrollView.bounces = NO;webView.scalesPageToFit = YES;webView.delegate = self;[webView loadRequest:request];[self.scrollView addSubview:webView];offSet.x += kWidth;[self.scrollView setContentOffset:offSet animated:YES];//寫入字典[_webArray addObject:webView];[_urlArray addObject:urlString];_count++;[_webDict setObject:_webArray[_count] forKey:_urlArray[_count]];// [self startAnimation];//執行互動操作[self mutualOCwithJS];}

但這種方式帶來的問題是記憶體暴漲,顯然還需要最佳化,於是我想到添加兩個數組去分別儲存新開啟頁面的url和webview,

//初始化數組和字典_webArray = [[NSMutableArray alloc]init];[_webArray addObject:_myWebView];_urlArray = [[NSMutableArray alloc]init];[_urlArray addObject:urlString];_webDict = [NSMutableDictionary dictionary];[_webDict setObject:_webArray[_count] forKey:_urlArray[_count]];

 

當跳轉至頻道頁首頁的時候將數組清空,同時把當前位置變為ScrollView的0位置,

NSString *resultStr = [webView stringByEvaluatingJavaScriptFromString:@"document.body.getAttribute(‘data‘)"];//頁面中含有頻道頁首頁標記if (![resultStr isEqualToString:@""]) {for (int i = 0; i<_count; i++) {[_webDict removeObjectForKey:_urlArray[0]];[_webArray[0] stopLoading];[_webArray[0] removeFromSuperview];[_webArray removeObjectAtIndex:0];[_urlArray removeObjectAtIndex:0];}_count = _webArray.count-1;}

當頁面返回時,把數組的最後一個資料移除,

//返回上一頁-(void)lastWeb{//翻頁動效CGPoint offSet = self.scrollView.contentOffset;if (offSet.x==0) {return;}offSet.x -= kWidth;[self.scrollView setContentOffset:offSet animated:YES];//銷毀不用的webView[_webArray[_count] stopLoading];[_webArray[_count] removeFromSuperview];//刪除字典[_webDict removeObjectForKey:_urlArray[_count]];[_webArray removeObjectAtIndex:_count];[_urlArray removeObjectAtIndex:_count];_count--;[self mutualOCwithJS];}

 

這兩條措施都有效降低記憶體損耗,同時保證了app頁面跳轉的平滑過渡,當然如果想要想原生app中的手勢右劃返回,我們這個也同樣可以完成。

//滑動手勢- (void)handleSwipes:(UISwipeGestureRecognizer *)sender{if (sender.direction == UISwipeGestureRecognizerDirectionRight) {[self lastWeb];}}

 

 

當然,我只是提供我的一種思路,而且我們也是這樣做的,可能還會有更好的思路,希望能多補充,共同進步。

ios&h5混合開發項目仿app頁面跳轉最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.