求 iOS 一个解决方案:关于在 TabelViewCell 中嵌套 UIWebView 加载 html,计算 UIWebView 高度的问题。

2015-10-10 14:56:46 +08:00
 VichyChen

TabelViewCell 嵌套 UIWebView , UIWebView 加载 html , html 中偶尔包括有<img>、<a>。

现在的问题是如何计算 UIWebView 的高度。
因为 UIWebView 的高度得在 webViewDidFinishLoad:中才能正确获取到,在 cell 中我是直接用 setFrame 来做定位的,现在我迷茫的就是要怎么准确计算出高度?

ps :如果用 setFrame 不好实现,用 autolayout 好实现吗?一直对 cell 中用 autolayout 来布局有点抗拒。。

现在的情况是哪种能实现就用哪种!求解决方案,求一个准确的思路!

9100 次点击
所在节点    iDev
36 条回复
kenshinhu
2015-10-10 15:00:52 +08:00
可以通过 js 桥接的方法,当 HTML 在 WebView 渲染完成后通过 JS 调用 OBJC 的代码来传递内容高度后再 UI 里调用
kenshinhu
2015-10-10 15:03:55 +08:00
其实 frame 或 layout 也一样,你得要知道 WEB 内容的高度才能展示,至于 IMG 标签的问题,可以通过 CSS 固定高度的方式解决,或能过先检测 HTML 内的图片地址并下载,再和内容一起计算高度
当然 如果你的需求可以在 webview 里是有 SCOLLVIEW 的话,以上就是然并...
VichyChen
2015-10-10 15:28:42 +08:00
@kenshinhu T_T 完蛋听不懂,还是不晓得怎么处理。。

我现在的流程是: cellForRowAtIndexPath 对 cell 里的 UIWebView 做赋值,在 cell 的 layoutSubviews 里面做 setFrame ,然后普通情况我的高度计算都放在网络请求回调之后先计算缓存在数组,然后现在知道 UIWebView 要在 webViewDidFinishLoad 中再获取高度再重新调整,就不晓得咋办了。。

求解释清晰点,能不用 js 尽量别用到 js =。=
ltfpeter
2015-10-10 15:45:10 +08:00
说个有点跑题的问题,你是每个 cell 都内嵌了一个 webview 么?如果 webview 太多容易运行效率很低吧
VichyChen
2015-10-10 15:51:50 +08:00
@ltfpeter
我试了写好一定高度,跑起来没觉得有卡顿的情况呀。。

好吧 那有一个可以显示 html ,显示<img>,能响应到超链接的轮子吗?
attributedstring 不懂怎么响应超链接, RTLabel 显示不了<img>,其他一些轮子都有一两种实现不了。。
至于什么用 textkit 自己写一个富文本。。这个先排除。。 T_T
loveuqian
2015-10-10 16:05:39 +08:00
你是在问网页的高度怎么计算吗?
SniperX
2015-10-10 16:10:33 +08:00
@VichyChen 有个 DTCoreText 的轮子,功能很强大, HTML 标签里,除了表格支持不太好,其他都很不错。 img 便签甚至可以自己写 delegate 方法用 SDWebImage 来加载,所以也可以支持图片异步加载后 Cell 高度重新计算。看你的描述, DTCoreText 应该能满足你的需求,推荐你去跑下 DEMO 看看。
newtonisaac
2015-10-10 16:12:24 +08:00
webViewDidFinishLoad 之后 reload 这个 cell
CDuXZMAPgHp1q9ew
2015-10-10 16:27:11 +08:00
1 不要这么做 如果网页的高度不断变化的话, 意味着要不断 update tableview, cell 再多起来的话, 性能要恶化了
2 只有一个 cell 里面是 webview 的话, 可以用 kvo observer webview.contentSize, contentSize.height 是高度
主要这个值可能是随着网页加载不断变化的
onevcat
2015-10-10 16:53:42 +08:00
为什么老想着把 webview 塞到 cell 里这种邪门歪道,而不去花哪怕那么一点点时间去了解一下 Text Kit 呢?
给几个关键字吧
1. 用 textview 做, subclass 一个 UITextView 是很好的 start point
2. 超链接处理 -> characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
3. 图片 -> NSTextAttachment

当然你如果很赶工期的话直接用 DTCoreText 应该也不错,不过你就错过了一个尝试使用 Text Kit 的好机会,会比较可惜。
wingyiu
2015-10-10 16:55:14 +08:00
CoreText?
xxppxiaowei
2015-10-10 16:56:54 +08:00
@onevcat
@VichyChen 听猫大的。。 猫大 居然逛 v2ex
xieguobihaha
2015-10-10 17:03:59 +08:00
@onevcat 喵大萌萌哒~
pljhonglu
2015-10-10 18:05:40 +08:00
喵神说得对,如果不赶工期的话建议还是学一下 TextKit ,否则的话建议把整个列表页面做成 web 形式,这样只需要一个 webview 就可以解决了~
kobe1941
2015-10-10 18:15:32 +08:00
@onevcat 喵神,什么时候用 Text Kit 什么时候用 CoreText ?感觉这种网页直接用 CoreText 有点大材小用啊
MountainRain
2015-10-10 18:44:02 +08:00
最好的方案,用原生哇。。。。哈哈哈哈
VichyChen
2015-10-10 20:30:07 +08:00
@newtonisaac @wujichao
关键问题是 reload 之后要重新执行 cellForRowAtIndexPath ,然后又要对 UIWebView 加载 html 了吧?加载完又会调用到 webViewDidFinishLoad ,就变成无限循环调用了,这个可以如何处理?

@SniperX 昨晚试了下 DTCoreText ,好惭愧,下了个 demo 居然不晓得怎么跑起来,一心烦就没仔细研究=。= 用 cocoapod 安装完后图片又显示不出来,不知道正确姿势,得仔细再研究下=。=

@onevcat 感谢喵神回复=。=
本来一开始是找轮子的,后来有人说用 UIWebView ,内容显示得好好的结果计算高度原来是坑 T_T
简单的 text kit 倒是有用过。。。
主要文本内容是 discuz 论坛的回复,夹杂着引用的 div 标签,论坛表情,还有一些超链接,要把这些标签解析匹配出来貌似也挺麻烦的啊。。难道要用类似 hpple 这种先把数据解析出来?

@pljhonglu 是一个好办法,但是还是一样要解析 html ,而且做成 web 形式太考验前端功底, web 前端不太懂 T_T
CDuXZMAPgHp1q9ew
2015-10-10 21:32:21 +08:00
@VichyChen 不 reloadcell, 在 heightForCell 里返回新的高度, 然后 [tableview beginUpdate]; [tableview endUpdate]; 即可

如果你要做论坛客户端 你可以看下我的项目 hipda 论坛非官方客户端 https://github.com/wujichao/hipda_ios_client_v3/ 里面详细介绍了怎么展示帖子 各种技术的好处坏处, 还有代码, 虽然是我两年前写的, 但是一直有维护
longaiwp
2015-10-10 21:45:28 +08:00
@MountainRain 我支持原生,用 html 来代替的都是邪教(大雾
VichyChen
2015-10-11 00:37:34 +08:00
@wujichao 已 star ,有需要再向你请教,谢谢=。=

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX