iOS邮件展开收起引用

作者: GRV_Lv | 来源:发表于2018-12-10 17:00 被阅读7次

    LVMailExpander

    在WebView中类似邮件转发内容展开收起功能,之前也有想过分为上下两部分控件来实现,但觉得最终要和Android统一实现方案,最后还是决定使用html和JS交互来完成这个功能点,通过约定的标识符来注入html标签,用JS交互来实现展开和收起的动作


    关键点

    <div class=\"blockquote_fromhere_element\"></div>
    

    自定义的标识符,用来找到需要注入展开收起标签的位置

    <label class=\"quoteLabel\" style=\"font-size:14px;color:#888888;vertical-align:middle\" onclick=\"window.webkit.messageHandlers.quoteAction.postMessage(0)\">展开引用内容</label>
    

    文案标签,这边用class属性来作为标识符,之后会用JS通过class获取标签,修改文案内容,也可以是id或其他,最后影响的不过是JS获取方式

    UIImage *quoteArrow = [UIImage imageNamed:@"quoteArrow"];
    NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[UIImageJPEGRepresentation(quoteArrow, 1)
    NSString *imgTag = [NSString stringWithFormat:@"<img class=\"quoteArrow\" src=\"%@\" style=\"transform:rotate(0deg);vertical-align:middle;margin-bottom:2px\" width=\"15\" height=\"15\" onclick=\"window.webkit.messageHandlers.quoteAction.postMessage(0)\"/>", imageSource];
    

    接下来是小箭头图标,在img标签里使用本地图片,scr需要使用base64格式,同label标签一样,注册点击事件

    <div class=\"quoteDiv\" style=\"display:none\">
    

    最后也是最关键的一步,生成一个div,嵌套下面需要隐藏的所有内容,之后通过JS调用,设置style的display属性来完成展开收起


    JS调用

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
        if ([message.name isEqualToString:@"quoteAction"]) {
            NSString *divJs = [NSString stringWithFormat:@"document.getElementsByClassName(\"quoteDiv\")[0].style.display=\"%@\"", _isShowQuote ? @"block" : @"none"];
            NSString *labelJs = [NSString stringWithFormat:@"document.getElementsByClassName(\"quoteLabel\")[0].innerHTML=\"%@\"", _isShowQuote ? @"收起引用内容" : @"展开引用内容"];
            NSString *imgJs = [NSString stringWithFormat:@"document.getElementsByClassName(\"quoteArrow\")[0].style.transform=\"%@\"", _isShowQuote ? @"rotate(180deg)" : @"rotate(0deg)"];
            [self quoteAction:divJs];
            [self quoteAction:labelJs];
            [self quoteAction:imgJs];
            _isShowQuote = !_isShowQuote;
        }
    }
    
    - (void)quoteAction:(NSString *)js {
        [_webView evaluateJavaScript:js completionHandler:nil];
    }
    

    WKWebView的JS回调,quoteAction是我们自定义的回调方法,新增了一个BOOL变量来控制文案和箭头的变化


    最后

    _webView.configuration.preferences.javaScriptEnabled = YES;
    [_webView.configuration.userContentController addScriptMessageHandler:self name:@"quoteAction"];
    [_webView.configuration.userContentController removeScriptMessageHandlerForName:@"quoteAction"];
    

    最后别忘了开启WKWebView的JS调用,注册事件,记得退出界面前销毁,不然会造成内存泄漏
    Demo下载地址 https://github.com/grvlv/LVMailExpander

    相关文章

      网友评论

        本文标题:iOS邮件展开收起引用

        本文链接:https://www.haomeiwen.com/subject/bvkdhqtx.html