iOS走近商城APP(三 WKWebView 商品規格選擇框架封裝)

開篇

忽然發現最近也只有值班才能寫東西了,中間更新了兩篇其他的斷了下商城相關的文章,仔細看了看之前覺得干貨太少,今天寫點實際的吧,閑說少說商城相關的更新今天繼續吧,哈哈。前兩篇文章:iOS走近商城APP(一) ,iOS走近商城APP(二 購物車常用控件)(今天值班整座大樓一如既往的靜悄悄,膽小怪我咯-_-、)。

主要內容

  • 使用WKWebView替換Webview
    WKWebView的html網頁的加載方法
    WKWebView顯示網頁的base頁面的封裝,點擊頁面的攔截方法
    商品詳情頁頁面的自適應布局
  • 商品規格選擇框架
    基于內容寬度自適應的框架封裝,優化之前介紹的第三方框架帶來的問題

使用WKWebView替換Webview

在商城中,使用html網頁做展示頁面,商品詳情,活動頁面再常見不過,往往有許多,但是
Webview大量使用會存在內存暴增,如果用WKWebView就能大大減少內存,下面就具體介紹一下使用過程,至于WKWebView的原理以及基本的代理這里就不一一列舉了,實戰出發,哈哈。

  • 活動頁Webview的替換

簽到頁面.png
如圖我們點擊立即簽到和立即簽錢,會觸發不同的點擊事件,當然在許多別的頁面,我們點擊網頁上的內容還要跳轉到軟件本身的界面,我們的怎么處理他呢?在老的Webview中我們遵循UIWebViewDelegate的代理方法,然后處理方式如下

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
}

攔截點擊事件,然后再方法中做出處理

  NSString* urlString=[[request URL] absoluteString];
    NSLog(@"%@",urlString);
    NSArray* actionArray=[urlString componentsSeparatedByString:@"-"];
    for (NSString* actionStr in actionArray) {
        if ([actionStr isEqualToString:@"SignNew.StartSign"]) {//跳轉簽到頁面-action
            [webView stopLoading];
            [self gotoSignIn];
        }else if([actionStr isEqualToString:@"Task.TaskDetail"]){//跳轉界面

....代碼原理同上

        }else if([actionStr isEqualToString:@"Task.TaskList"]){//跳轉頁面

...代碼原理同上

        }

原理就是我們截取到點擊事件然后根據后臺返回的網址進行處理,根據網址中不同的字段跳轉到我們想要跳轉的頁面。
在WKWebView中我們的處理方式如下遵循WKNavigationDelegate代理方法,然后調用方法

#pragma mark - WKWebviewDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
}

在這個方法中進行上述的處理,

   NSString *urlString = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"%@",urlString);
    NSArray* actionArray=[urlString componentsSeparatedByString:@"-"];
    for (NSString* actionStr in actionArray) {
        if ([actionStr isEqualToString:@"SignNew.StartSign"]) {//跳轉頁面-action
            [webView stopLoading];

...

        }else if([actionStr isEqualToString:@"Task.TaskDetail"]){//跳轉界面

...

        }

在處理完跳轉邏輯之后記得加上這句代碼

    decisionHandler(WKNavigationActionPolicyAllow);//允許跳轉

下面再放兩個加載時的協議方法

// 頁面加載完成之后調用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    });
}
// 頁面加載失敗時調用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    });
}

  • WKWebView 商品詳情頁的自適應布局
商品詳情頁.png

如圖所示,商品詳情的時候我們要根據每個商品詳情的不同來對他進行自適應的圖文布局,他并不像我們的活動頁面那么簡單,由于數量比較多,內容不固定因此我們在加載頁面的時候要做處理(但是這個一般就不需要做點擊交互處理了,哈哈),代碼如下

-(WKWebView *)webView{
    if (_webView==nil) {
        NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
        
        WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
        WKUserContentController *wkUController = [[WKUserContentController alloc] init];
        [wkUController addUserScript:wkUScript];
        
        WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
        wkWebConfig.userContentController = wkUController;
        
        _webView=[[WKWebView alloc] initWithFrame:CGRectZero configuration:wkWebConfig];
        _webView.navigationDelegate = self;
        NSURLRequest* request=[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
        [_webView loadRequest:request];

    }
    return _webView;
}

加入一段JS代碼對頁面進行布局處理。

商品詳情的框架封裝

iOS走近商城APP(二 購物車常用控件)文章中,我們介紹了一個商品詳情布局的控件,雖然有優點,但是也有他的局限性,因為如果在商品規格比較單一,且長度較短或者固定的時候,是很美觀的,但是如果我們想要根據不同的規格長度進行自適應,問題就來了,就出現了商品顯示不完整的情況,今天放一個在那個版本的基礎上自己又重新封裝過的框架吧。效果圖如下

詳情頁布局.png
主要的操作就是優化了根據規格不同,對標簽長度以及換行的計算標準更加的趨向于實際應用。
標簽的自適應計算主要代碼如下(具體可以看git中的源碼):
首先創建系統的函數如下,其效果類似于for in遍歷

- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

然后再函數中的處理

  [_filterData.elements enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    
        Btnx += btnGap;

        CGFloat btnWidth = [self WidthWithString:obj fontSize:14 height:BtnHeight];
        btnWidth += 10;//讓文字兩端留出間距
        
        if(btnWidth<minBtnLength)
            btnWidth = minBtnLength;
        
        if(btnWidth>maxBtnLength)
            btnWidth = maxBtnLength;
        
        
        if(Btnx + btnWidth > oneLineBtnWidtnLimit)
        {
            BtnlineNum ++;//長度超出換到下一行
            Btnx = btnGap;
        }
        
        UIButton *button = [[UIButton alloc] init];
        
        //Y坐標
        CGFloat height = btnGapY+ (BtnlineNum*(BtnHeight+btnGapY));
        
//        NSLog(@"Y坐標-------------%f",height);
        
        button.frame = CGRectMake(Btnx, height,
                               btnWidth,BtnHeight );
        
    
//此處省略按鈕的具體屬性的設置

        [button addTarget:self action:@selector(buttonSelected:)
         forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
        [_buttons addObject:button];
        
        Btnx = button.frame.origin.x + button.frame.size.width + btnGap;
        
        totalHeight = height; //行高為最大的Y坐標加高度

下面放上一個詳細舉例的gif效果圖。

介紹圖2.gif

代碼傳送門GSFilterView,有用的可以點個星哦。

后記

慣例閑扯時間,哈哈,下一篇將寫一下runloop在訂單列表中的實際應用,獲取通訊錄手機號碼以及iOS9與iOS8下的處理等,督促自己一波哈哈。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,643評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,151評論 4 61
  • 昨晚做了件比較瘋狂的事,九點下班,去超市買了少許生活用品,然后回到合租的僅有一個屬于自己的房間的房子里,一口氣吃了...
    61e4cc0a805f閱讀 264評論 0 0
  • “當我們朝著那個做夢也要抵達的遠方眺望時,之所以感到快樂,是因為我們好像都能看到自己的身影。而這也似乎是我們為何悲...
    chocolatem閱讀 185評論 1 1
  • 本文為菜鳥窩作者蔣志碧的連載。“從 0 開始開發一款直播 APP ”系列來聊聊時下最火的直播 APP,如何完整的實...
    菜鳥窩閱讀 712評論 0 8