图文混排的贴子回复列表,适合用 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] 也是没效果的

10456 次点击
所在节点    iDev
43 条回复
zhigang1992
2014-12-30 10:33:09 +08:00
@cielpy 没说只能一条啊😃 如果是iOS8的话auto layout怎么用,他就怎么用。
Hysteria
2014-12-30 13:04:23 +08:00
@WildCat 这到也是啊。。。要不做成像微博客户端那种,把图片当做附件另外处理吧。
hoogle
2014-12-30 14:24:15 +08:00
我写的时候通过读取缓存来避免循环 reload cell 的问题。 当然最好的是直接通过图片 URL 加入 hash 来取原始大小。。
cielpy
2014-12-30 15:06:40 +08:00
@zhigang1992 两个高度可变的控件的constaint不知道怎么设置了。。
yellowV2ex
2014-12-30 16:53:48 +08:00
@kmvan 难道要跟php那么low吗?哈哈哈
yellowV2ex
2014-12-30 16:57:17 +08:00
@cielpy 我一般是弄一个 tempCell,然后 heightForCell 的时候把参数给这个temp然后返回temp的高度,虽然资源占用浪费了一点点,但方便啊,不用自己再去算一遍高。
但这种做法不是最优,也比较浪费资源,正确的做法是,类似微信朋友圈,如果文字多过某个限定值,加一个显示更多。
pubby
2014-12-30 17:02:43 +08:00
@Hysteria 如果比例很夸张,高度固定后,宽度"超出"设备屏幕的怎么处理?
此时:高度还是固定,但是图片居中并限制宽度?
cielpy
2014-12-30 18:43:27 +08:00
@yellowV2ex 我做的不是评论这种的,是每个cell有图片,然后对图片有一个简单的介绍,在图片的下面,还有几个其他的控件,但是位置大小都固定。
yellowV2ex
2014-12-30 19:17:41 +08:00
@cielpy 实在要做的话,那就先给一个loading图片的高度,载入了之后,再reloaddata好了,然后把这个图片对应的高宽记下来,下次用
yellowV2ex
2014-12-30 19:18:05 +08:00
@cielpy 当然, 正确的做法是后台读到图片高宽传给你按比例计算
hyzjshwo
2014-12-30 19:28:48 +08:00
固定大小,如果动态是不是我上传一个1px * 800px的图 你app怎么玩?
cielpy
2014-12-30 19:36:55 +08:00
@yellowV2ex 我用了autolayout,后台返回宽高比,我计算出图片应有的宽高,这个时候是可以知道图片的位置的,但是在storyboard里,这个imageView的contraint怎么设置呢。
nathanw
2014-12-30 20:05:59 +08:00
可以参考一些微博客户端的做法
yellowV2ex
2014-12-30 20:10:37 +08:00
@cielpy 不好意思,autolayout不熟,你设置imageView下面的那堆东西相对于imageView的位置来自动位置,那么只需要设置 imageView frame 的 height,下面就应该会跟着变位置了吧。
Elethom
2014-12-30 20:33:49 +08:00
@WildCat
未經過排版就按原比例顯示很容易打破佈局, 比如說保持 aspect fill 寬度, 那我發一張 1x100 的小圖就可以刷屏了.
WildCat
2014-12-30 20:52:19 +08:00
@Elethom 为什么总考虑极端呢?这种情况加个最大 height 限制不就可以了? 我主要是这种图文混排的实现,极端情况自然会考虑。
Hysteria
2014-12-30 23:06:29 +08:00
@pubby 这时候我倾向于宽度为设备宽度,重新等比例缩放。
Hysteria
2014-12-30 23:09:59 +08:00
@WildCat 效果确实没啥好大的问题。这两个客户端,好像都是取回图片之后,按照固定宽度,等比例缩放显示的。
Esay
2014-12-31 00:25:25 +08:00
按照自己的理解大致写了一下 https://github.com/Jeswang/load-cell-image

太晚了,代码还有问题。没有 lazy load,用的是直接加载图片。如果 lazy load 的话,需要缓存一下图片,并且检查发起 lazy load 的 cell 是否可见(继承 DTLazyImageView,增加一个指向 cell 的引用)

明天再改吧
joeytat
2015-02-11 17:00:30 +08:00
没做过,但感觉可以实现。

你先 lazy load,图片到了之后放进 NSTextAttachment 里面,然后扔进 NSAttributedString 里面实现图文混排。最后就可以用 textView.sizeThatFits: 来获得混排之后的高度了。

有了高度之后 reload 一下 cell 就好了嘛。

之前写过一个 NSAttributedString 图文混排的扩展,应该改改就能用。 https://github.com/joeytat/JTATEmoji

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

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

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

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

© 2021 V2EX