图文混排的贴子回复列表,适合用 UITableView 吗?图片异步加载后需要重新计算行高后如何重新渲染 UITableViewCell

2014-12-29 23:45:13 +08:00
 WildCat

最近在用 DTAttributedTextContentView (DTCoreText) 做图文混排,图片都是 lazy load 的,图片加载完成后,有个回调方法 - (void)lazyImageView:(DTLazyImageView *)lazyImageView didChangeImageSize:(CGSize)size ,这里可以获得图片的高度,或者重新计算 DTAttributedTextContentView 的高度。

那么问题来了,图片加载后 DTAttributedTextContentView 的高度肯定会增加,这个 DTAttributedTextContentView 是在一个 UITableViewCell 里的,如何对它重绘?如果调用
[tableview reloadRowsAtIndexPaths:[NSArray arrayWithObject: xxxIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]
这个方法,这个 cell 还是会被重新加载,高度还是重新计算,成为一个死循环。

我在做的是 iOS8 only app, TableViewCell 用的是约束布局。 似乎调用 [cell setNeedsDisplay] 也是没效果的

10554 次点击
所在节点    iDev
43 条回复
kmvan
2014-12-29 23:48:37 +08:00
一直想问问,为啥ios开发和安卓开发里面的内置类或对象,都是驼峰命名?没有下划线命名吗?
Elethom
2014-12-30 00:11:07 +08:00
圖片固定比例是 UI 設計的常識吧...
WildCat
2014-12-30 00:53:41 +08:00
@Elethom
问题是 V2EX 的图片附件这样的
Daniel65536
2014-12-30 01:37:26 +08:00
不如固定显示成缩略图小正方形,提供一个点击查看大图的功能……?
wezzard
2014-12-30 03:46:19 +08:00
你應該改變設計讓圖片的大小變成固定的,或者顯示多行圖像,但是每行的行高是固定的。

即使 UITableView 能如你所說實現根據異步加載的內容動態調整尺寸,其所帶來的跳躍也是相當不友好的,尤其是在滾動中,用戶滾着滾着就丟失目前滾到哪的感知了。
WildCat
2014-12-30 08:08:22 +08:00
@Daniel65536
@wezzard
@Elethom

说下场景,就是 V2EX 客户端,帖子回复里的图片数量,大小和比例都不确定。如果缩略图固定比例肯定会非常难看,还是有必要动态调整的。
目前这么做(动态调整)的就是威锋网客户端,但是不知道它是怎么实现的。


@wezzard
能否简单介绍下思路?谢谢!
Elethom
2014-12-30 08:10:22 +08:00
@WildCat
好一個 "肯定會"...
dcty
2014-12-30 08:23:10 +08:00
@WildCat 接口中返回图片的高宽,本地计算合适的size,布局的时候直接用size。
WildCat
2014-12-30 08:26:57 +08:00
@dcty V2EX 没有这样的接口啊
WildCat
2014-12-30 08:30:12 +08:00
@Elethom

您如果觉得我这个“肯定会”有问题请说原因。
假如图片比例是 3:2 ,变成 1:1 必然不好看吧。
pljhonglu
2014-12-30 08:36:36 +08:00
1.接口返回图片宽高,事先占位
2.固定图片宽高
zhigang1992
2014-12-30 08:58:21 +08:00
不需要,直接修改height delegat然后
tableview.benginupdate
tableview.endupdate
zhigang1992
2014-12-30 09:00:34 +08:00
如果你使用的autolayout让iOS自己计算的话,用constraint把内容撑大就好了。
dopcn
2014-12-30 09:21:17 +08:00
@kmvan 歪楼好惨,iOS 除非特殊情况没有下划线命名,因为 SDK 就是这么做的,为了写人能看懂的代码,跟着 SDK 走很必要。有一个特殊是C 语言宏名,是按 C 语言那种大写加下划线
dopcn
2014-12-30 09:33:12 +08:00
图片异步加载常见的使用场景都是固定图片大小异步加载,如果异步加载后需要重新计算行高再 somehow 重新渲染 UITableViewCell,异步加载无法确定什么时候结束,如果还没结束你往下拉了,异步加载结束了tableView岂不是蹦来蹦去?

方案1:前面有人提到了,用一个「图片」的图标做 placeholder,点击查看大图,这个方案也是我在做的公司项目的做法,还不错
方案2:我自己做过一个类似论坛客户端用的方法是 UIWebView,勉强也可以实现图文混排,似乎算异步请求图片,效果就是上面说的蹦来蹦去
LINAICAI
2014-12-30 09:43:24 +08:00
@kmvan 下划线一般用在变量和属性,对象和内置类都是驼峰命名
LINAICAI
2014-12-30 09:48:24 +08:00
其实楼主这种方法貌似不现实啊,抛开解决方案难不说,其实这样的体验并非必须,15楼说的方案不错可以参考。
按照楼主的需求,肯定不能只reload一行吧~
cielpy
2014-12-30 10:01:03 +08:00
@zhigang1992 请教一下,如果有多个view的高度会变呢,比如说一个cell里的图片有标题,图片加载完成后知道高度,标题如果有多行则显示为多行,这个constraint该怎么设置呢。
Hysteria
2014-12-30 10:17:10 +08:00
@WildCat 我还是觉得移动端上采用图片行固定高度的方式好。图片采用等比缩放,始终不变形就还好吧。
WildCat
2014-12-30 10:20:47 +08:00
@Hysteria 问题是,一层楼的图片数量也不确定

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

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

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

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

© 2021 V2EX