最近在用 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] 也是没效果的
![]() | 1 kmvan 2014-12-29 23:48:37 +08:00 一直想问问,为啥ios开发和安卓开发里面的内置类或对象,都是驼峰命名?没有下划线命名吗? |
![]() | 2 Elethom 2014-12-30 00:11:07 +08:00 via iPhone ![]() 片固定比例是 UI 的常吧... |
![]() | 4 Daniel65536 2014-12-30 01:37:26 +08:00 ![]() 不如固定显示成缩略图小正方形,提供一个点击查看大图的功能……? |
![]() | 5 wezzard 2014-12-30 03:46:19 +08:00 ![]() 你改片的大小成固定的,或者示多行像,但是每行的行高是固定的。 即使 UITableView 能如你所根步加的容整尺寸,其所的跳也是相不友好的,尤其是在中,用着着就失目前到哪的感知了。 |
![]() | 6 WildCat OP @Daniel65536 @wezzard @Elethom 说下场景,就是 V2EX 客户端,帖子回复里的图片数量,大小和比例都不确定。如果缩略图固定比例肯定会非常难看,还是有必要动态调整的。 目前这么做(动态调整)的就是威锋网客户端,但是不知道它是怎么实现的。 @wezzard 能否简单介绍下思路?谢谢! |
![]() | 10 WildCat OP |
11 pljhonglu 2014-12-30 08:36:36 +08:00 ![]() 1.接口返回图片宽高,事先占位 2.固定图片宽高 |
![]() | 12 zhigang1992 2014-12-30 08:58:21 +08:00 via Android ![]() 不需要,直接修改height delegat然后 tableview.benginupdate tableview.endupdate |
![]() | 13 zhigang1992 2014-12-30 09:00:34 +08:00 via Android 如果你使用的autolayout让iOS自己计算的话,用constraint把内容撑大就好了。 |
![]() | 14 dopcn 2014-12-30 09:21:17 +08:00 @kmvan 歪楼好惨,iOS 除非特殊情况没有下划线命名,因为 SDK 就是这么做的,为了写人能看懂的代码,跟着 SDK 走很必要。有一个特殊是C 语言宏名,是按 C 语言那种大写加下划线 |
![]() | 15 dopcn 2014-12-30 09:33:12 +08:00 ![]() 图片异步加载常见的使用场景都是固定图片大小异步加载,如果异步加载后需要重新计算行高再 somehow 重新渲染 UITableViewCell,异步加载无法确定什么时候结束,如果还没结束你往下拉了,异步加载结束了tableView岂不是蹦来蹦去? 方案1:前面有人提到了,用一个「图片」的图标做 placeholder,点击查看大图,这个方案也是我在做的公司项目的做法,还不错 方案2:我自己做过一个类似论坛客户端用的方法是 UIWebView,勉强也可以实现图文混排,似乎算异步请求图片,效果就是上面说的蹦来蹦去 |
![]() | 17 LINAICAI 2014-12-30 09:48:24 +08:00 ![]() 其实楼主这种方法貌似不现实啊,抛开解决方案难不说,其实这样的体验并非必须,15楼说的方案不错可以参考。 按照楼主的需求,肯定不能只reload一行吧~ |
![]() | 18 cielpy 2014-12-30 10:01:03 +08:00 @zhigang1992 请教一下,如果有多个view的高度会变呢,比如说一个cell里的图片有标题,图片加载完成后知道高度,标题如果有多行则显示为多行,这个constraint该怎么设置呢。 |
![]() | 21 zhigang1992 2014-12-30 10:33:09 +08:00 via Android @cielpy 没说只能一条啊 如果是iOS8的话auto layout怎么用,他就怎么用。 |
![]() | 23 hoogle 2014-12-30 14:24:15 +08:00 ![]() 我写的时候通过读取缓存来避免循环 reload cell 的问题。 当然最好的是直接通过图片 URL 加入 hash 来取原始大小。。 |
![]() | 24 cielpy 2014-12-30 15:06:40 +08:00 @zhigang1992 两个高度可变的控件的constaint不知道怎么设置了。。 |
![]() | 25 yellowV2ex 2014-12-30 16:53:48 +08:00 @kmvan 难道要跟php那么low吗?哈哈哈 |
![]() | 26 yellowV2ex 2014-12-30 16:57:17 +08:00 ![]() @cielpy 我一般是弄一个 tempCell,然后 heightForCell 的时候把参数给这个temp然后返回temp的高度,虽然资源占用浪费了一点点,但方便啊,不用自己再去算一遍高。 但这种做法不是最优,也比较浪费资源,正确的做法是,类似微信朋友圈,如果文字多过某个限定值,加一个显示更多。 |
![]() | 28 cielpy 2014-12-30 18:43:27 +08:00 @yellowV2ex 我做的不是评论这种的,是每个cell有图片,然后对图片有一个简单的介绍,在图片的下面,还有几个其他的控件,但是位置大小都固定。 |
![]() | 29 yellowV2ex 2014-12-30 19:17:41 +08:00 @cielpy 实在要做的话,那就先给一个loading图片的高度,载入了之后,再reloaddata好了,然后把这个图片对应的高宽记下来,下次用 |
![]() | 30 yellowV2ex 2014-12-30 19:18:05 +08:00 @cielpy 当然, 正确的做法是后台读到图片高宽传给你按比例计算 |
31 hyzjshwo 2014-12-30 19:28:48 +08:00 固定大小,如果动态是不是我上传一个1px * 800px的图 你app怎么玩? |
![]() | 32 cielpy 2014-12-30 19:36:55 +08:00 @yellowV2ex 我用了autolayout,后台返回宽高比,我计算出图片应有的宽高,这个时候是可以知道图片的位置的,但是在storyboard里,这个imageView的contraint怎么设置呢。 |
33 nathanw 2014-12-30 20:05:59 +08:00 ![]() 可以参考一些微博客户端的做法 |
![]() | 34 yellowV2ex 2014-12-30 20:10:37 +08:00 @cielpy 不好意思,autolayout不熟,你设置imageView下面的那堆东西相对于imageView的位置来自动位置,那么只需要设置 imageView frame 的 height,下面就应该会跟着变位置了吧。 |
![]() | 35 Elethom 2014-12-30 20:33:49 +08:00 via iPhone ![]() @WildCat 未排版就按原比例示很容易打破局, 比如保持 aspect fill 度, 那我一 1x100 的小就可以刷屏了. |
![]() | 36 WildCat OP @Elethom 为什么总考虑极端呢?这种情况加个最大 height 限制不就可以了? 我主要是这种图文混排的实现,极端情况自然会考虑。 |
![]() | span class="no">38 Hysteria 2014-12-30 23:09:59 +08:00 @WildCat 效果确实没啥好大的问题。这两个客户端,好像都是取回图片之后,按照固定宽度,等比例缩放显示的。 |
![]() | 39 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 的引用) 明天再改吧 |
![]() | 40 joeytat 2015-02-11 17:00:30 +08:00 ![]() 没做过,但感觉可以实现。 你先 lazy load,图片到了之后放进 NSTextAttachment 里面,然后扔进 NSAttributedString 里面实现图文混排。最后就可以用 textView.sizeThatFits: 来获得混排之后的高度了。 有了高度之后 reload 一下 cell 就好了嘛。 之前写过一个 NSAttributedString 图文混排的扩展,应该改改就能用。 https://github.com/joeytat/JTATEmoji |
41 wtgam 2015-09-10 00:40:05 +08:00 请问楼主这个问题解决了吗?请回复,我也遇到同样的问题,急,谢谢 |