iOS邮件展开收起引用

LVMailExpander

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


关键点

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


文案标签,这边用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:@"", imageSource];

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

最后也是最关键的一步,生成一个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邮件展开收起引用)