首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >动态行高变化的JSQMessagesView问题

动态行高变化的JSQMessagesView问题
EN

Stack Overflow用户
提问于 2017-01-28 05:30:34
回答 2查看 416关注 0票数 4

我正在为我的应用程序实现一个简单的信使,用户可以在其中聊天。信使基于UICollectionView (JSQMessagesViewController),其中每个消息都由一个UICollectionView行表示。每个邮件都有一个顶部标签,用于发送邮件时显示。这个标签最初是隐藏的(height=0),当用户点击特定的消息(行)时,标签通过设置相应的高度来显示。(height=25)

我面临的问题是显示标签的实际动画。(高度变化)。行的一部分在到达它的位置之前,将行下面的部分覆盖几个像素。同样,当隐藏标签回来时,动画首先将高度设置为零,然后文本淡出,覆盖了部分看起来非常糟糕的消息。

因此,基本上,我想要达到的是摆脱这两个前面提到的问题。

代码:

代码语言:javascript
运行
AI代码解释
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForCellTopLabelAt indexPath: IndexPath!) -> CGFloat {
        if indexPath == indexPathTapped {
            return 25
        }

        let messageCurrent = messages[indexPath.item]
        let messagePrev: JSQMessage? = indexPath.item - 1 >= 0 ? messages[indexPath.item - 1] : nil

        if messageCurrent.senderId == messagePrev?.senderId || messagePrev == nil {
            return 0
        }
        else{
            return 25

        }
    }

    override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAt indexPath: IndexPath!) {
        if let indexPathTapped = indexPathTapped, indexPathTapped == indexPath {
            self.indexPathTapped = nil
        }
        else{
            indexPathTapped = indexPath
        }

        collectionView.reloadItems(at: [indexPath])

//        UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveLinear, animations: {
//            collectionView.performBatchUpdates({
//                collectionView.reloadItems(at: [indexPath])
//            }, completion: nil)
//        }, completion: nil)

    }

演示:(对质量感到抱歉)

如果有人能帮我解决这个问题,我会非常感激的,因为我已经花了好几个小时试图找出答案,却什么也没有得到。

提前谢谢你!

编辑:

我尝试了@jamesk提出的解决方案如下:

代码语言:javascript
运行
AI代码解释
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAt indexPath: IndexPath!) {
        if let indexPathTapped = indexPathTapped, indexPathTapped == indexPath {
            self.indexPathTapped = nil
        }
        else{
            indexPathTapped = indexPath
        }

        UIView.animate(withDuration: 0.25) {
            collectionView.performBatchUpdates(nil)
        }
}

并覆盖apply of JSQMessagesCollectionViewCell

代码语言:javascript
运行
AI代码解释
复制
extension JSQMessagesCollectionViewCell {

    override open func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
        super.apply(layoutAttributes)
        layoutIfNeeded()
    }
}

然而,这些变化导致:

我还尝试了第二个解决方案,使布局无效:

代码语言:javascript
运行
AI代码解释
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAt indexPath: IndexPath!) {
        if let indexPathTapped = indexPathTapped, indexPathTapped == indexPath {
            self.indexPathTapped = nil
        }
        else{
            indexPathTapped = indexPath
        }

        var paths = [IndexPath]()
        let itemsCount = collectionView.numberOfItems(inSection: 0)

        for i in indexPath.item...itemsCount - 1 {
            paths.append(IndexPath(item: i, section: 0))
        }


        let context = JSQMessagesCollectionViewFlowLayoutInvalidationContext()
        context.invalidateItems(at: paths)

        UIView.animate(withDuration: 0.25) {
            self.collectionView?.collectionViewLayout.invalidateLayout(with: context)
            self.collectionView?.layoutIfNeeded()
        }

    }

其结果如下:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-01 19:49:00

似乎有两个问题。第一个问题是,对reloadItems(at:)的调用仅限于旧小区和新小区之间的交叉衰落--它不会在旧小区的布局属性和新小区的布局属性之间进行插值。第二个问题是,似乎没有任何代码指示您选择的单元格在应用新的布局属性时执行布局传递。

JSQMessagesViewController框架使用了UICollectionViewFlowLayoutUICollectionViewFlowLayoutInvalidationContext的子类,因此在更新和动画项时,我们可以利用流布局的失效行为。所需做的就是使受单元高度变化影响的项的布局属性(即位置)和委托度量(即大小)失效。

下面的代码是为用于release_7.3分支JSQMessagesViewController中包含的Swift示例项目而编写的:

代码语言:javascript
运行
AI代码解释
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAt indexPath: IndexPath!) {
    // Determine the lowest item index affected by the change in cell size.
    // Lesser of previous tapped item index (if any) and current tapped item index.
    let minItem = min(tappedIndexPath?.item ?? indexPath.item, indexPath.item)

    // Update tapped index path.
    tappedIndexPath = (tappedIndexPath == indexPath ? nil : indexPath)

    // Prepare invalidation context spanning all affected items.
    let context = JSQMessagesCollectionViewFlowLayoutInvalidationContext()
    let maxItem = collectionView.numberOfItems(inSection: 0) - 1
    let indexPaths = (minItem ... maxItem).map { IndexPath(item: $0, section: 0) }

    context.invalidateItems(at: indexPaths) // Must include all affected items.
    context.invalidateFlowLayoutAttributes = true // Recompute item positions (for all affected items).
    context.invalidateFlowLayoutDelegateMetrics = true // Recompute item sizes (needed for tapped item).

    UIView.animate(withDuration: 0.25) {
        collectionView.collectionViewLayout.invalidateLayout(with: context)
        collectionView.layoutIfNeeded() // Ensure layout pass for visible cells.
    }
}

上述代码应具有合理的性能。

虽然必须始终重新计算受影响项的位置,但不必像上面所做的那样重新计算所有受影响项的大小。只重新计算已选中项的大小就足够了。但是,由于invalidateFlowLayoutDelegateMetrics属性的效果总是应用于每个失效项,为了实现更窄的方法,您需要使用两个流布局失效上下文并在它们之间进行划分(或者实现具有相应失效行为的自定义失效上下文)。除非仪器告诉你,否则这可能不值得。

票数 4
EN

Stack Overflow用户

发布于 2017-02-01 06:52:50

插入数据后,尝试添加这段代码。

代码语言:javascript
运行
AI代码解释
复制
collectionView.reloadItems(at: [indexPath])

UIView.animate(withDuration: 0.6) {
    self.view.layoutIfNeeded()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41910371

复制
相关文章
android本地lib通过gradle上传到本地nexus上
在apply plugin: 'com.android.library'下添加如下内容:
隔壁老李头
2018/08/30
2.7K0
android本地lib通过gradle上传到本地nexus上
YouTube 开始测试视频下载
由于 YouTube 不提供下载,所以你可以通过上百的站点,脚本,扩展和程序下载 YouTube 视频。最初,适合下载的格式是 FLV,这种格式只能使用 Adobe Flash 来播放。然后 YouTube 开始测试高清晰视频(包括 MP4),所以现在可以把 YouTube 视频导出成 MP4 格式。 其实下载 YouTube 导出的 MP4 文件,你可以使用以前下载 FLV 文件一样的 URL,然后在 URL 的最后附加上 "&fmt=18" 即可,如下:
Denis
2023/04/14
7000
YouTube 开始测试视频下载
教你下载YouTube的视频
huolong
2023/07/26
2.3K0
教你下载YouTube的视频
YouTube上最火的OpenCV-Python入门视频教程
今天跟大家推荐一份YouTube上最火的 OpenCV-Python 入门视频教程,该教程由CodeBind网站博主录制,从今年2月份到现在已经录制了38个主题。
CV君
2019/12/27
1.2K0
读累了看视频 :YouTube上最火的10个大数据视频
翻译 | 伯乐在线 - 柒柒 原文来自Eileen McNulty 无论你对大数据一无所知,还是想要拓展机器学习方面的知识;无论你有三小时,还是三分钟;无论你是想进一步了解这个技术还是那些高级应用,一起来看YouTube上最棒的大数据视频。(视频要翻墙观看哦!) 1. 《Kenneth Cukier: Big Data is Better Data 大数据让我们做得更好》 https://www.youtube.com/watch?v=8pHzROP1D-w 毫无疑问,这个选自人气颇高的TED Talks
CDA数据分析师
2018/02/23
2.5K0
android视频系列:视频解码篇--android上视频播放的实现
前言 要开始正儿八经地写视频系列文章了。思来想去,从播放器入手,再合适不过了。视频文件,只有播放出来,才显示出了意义;只有播放出来,才暴露出各种问题。先理解播放的场景,才能更好地理解视频处理时所选取的策略。 播放器做了什么 播放器播放视频,就是一步步剖开视频的内容,显示在屏幕上。 最简单的理解方式,是把视频文件看做一个容纳了很多图片的容器。播放时,从容器里取出一张图片,放到屏幕上显示,隔一点时间后,再从容器里取出下一张图,放到屏幕上。按次序把图片一张一张显示到屏幕上,等到最后一张也显示到屏幕上后,播放就完成
天天P图攻城狮
2018/02/02
4.1K0
android视频系列:视频解码篇--android上视频播放的实现
YouTube Direct:使用 YouTube 创建你自己的视频网站
YouTube 最近发布了一个新功能,YouTube Direct,它能让你i在自己的网站上直接嵌入 YouTube 视频上传功能,用户就能直接在第三方网站上上传视频,而 Direct 的用户则能够审核视频,是否接受用户上传的视频。这样 YouTube 除了是一个视频分享网站之外,现在又真正成为了一个视频服务存储服务平台,让任何媒体,组织或者个人都能利用 YouTube 构建属于自己的视频网站。
Denis
2023/04/14
1.9K0
YouTube Direct:使用 YouTube 创建你自己的视频网站
如何破解YouTube视频推荐算法
如果你是某个发行渠道(比如电影、戏剧、电视节目、网络视频)的内容工作者,那么内容的成败就取决于发行机制的运转逻辑。比如说,你制作了一档电视节目,你很想它能火起来,那么你就得知道该在哪里切入广告,怎么宣传节目,上哪个频道播放,所选的频道能被多少家庭收看,等等,诸如此类。 如果你的发行渠道是YouTube,那么你最应该搞清楚的是YouTube的算法是怎么工作的。然而,全天下所有由算法来运营的平台,要搞清楚这一点那不是一般的困难。 YouTube没有把他们算法用到的变量公之于众。要搞清楚其算法的运转原理,即使数据
用户1289394
2018/02/28
2.5K0
如何破解YouTube视频推荐算法
宽屏模式插入 YouTube 视频
最近 YouTube 将其网站上视频的播放格式改为 16:9 宽屏模式播放,原有 4:3 模式的视频依然可以兼容播放。
Denis
2023/04/14
9230
宽屏模式插入 YouTube 视频
如何下载YouTube上的视频、字幕、MP3以及封面文件
当你找到一些有用的YouTube视频,想要重复观看或者暂时没有时间观看的时候,你可能需要将这些视频文件下载下来。如果你正在寻找将YouTube上的文件下载到电脑的方法,包含YouTube上面的视频、字幕、封面以及MP3等文件,这篇教程可以帮到你。
dev.zhang
2022/05/23
4.2K0
如何下载YouTube上的视频、字幕、MP3以及封面文件
YouTube上最受欢迎的十大机器学习视频(最新)
选自KDnuggets 作者:Thuy T. Pham 机器之心编译 参与:微胖、黄小天 虽然 YouTube 有很多不错的机器学习视频,但是很难搞清楚是否值得一看,何况每分钟上传的视频长达 300 小时。在本文中,我们整理了观看量最高的十大机器学习视频。今天这篇推送更新了之前颇受欢迎的博文(2015 年 Youtube 最受欢迎十大机器学习视频,https://goo.gl/6ElLdd)。另外,我们也添加了 4 个最受欢迎的相关视频列表(本文第二部分)。 这份顶级机器学习视频排名包括斯坦福、 加州理工、
机器之心
2018/05/08
4.5K0
YouTube上最受欢迎的十大机器学习视频(最新)
正确下载youtube视频的方式
youtube这个不存在的网站上有很多有用的资料,一般来说我们是可以下载所有视频到本地以供离线的情况下的研究学习,网上有很多工具提供了下载功能,但是在试用了很多标称很好用的软件后,老高发现,真的没有一个能和youtube-dl相提并论,所以老高还是记录一下如何使用正确使用youtube-dl!
老高的技术博客
2022/12/28
1.2K0
视频切片并上传到GitHub
利用 jsDeliver + GitHub 实现免费 CDN 加速静态资源,例如图片、CSS、JS等,相信大家都知道。也有人想过存放视频,但是 jsDeliver 不支持加载超过 20M 的资源,所以视频需要压缩到 20M 以下。如果想要放部电影,那就需要用到 HLS切片 了。这里我用了狐妖小红娘竹业篇做测试,整部视频大小为 1.76G,以 20S 为一段共切了 506 段。
骤雨重山
2022/01/17
1.5K0
视频切片并上传到GitHub
视频切片并上传到GitHub
GitHub对项目大小的限制,因此请注意自己项目的大小和切片文件的大小,尽可能避免被GitHub警告。
赤月未咲
2023/03/17
1.6K0
开创YouTube视频基础架构新时代
运行一个全球平台,每天每时每刻都有大量的视频上传、存储和分发,给它的数百万创作者和数十亿观众,这是一项复杂而艰巨的任务。但是,如果一切都像它应该的那样工作,那么它就是以一种没有人注意到的方式完成的。在创新系列本期文章中,我们以罕见的内部视角介绍了一项重要创新,这项创新开创了YouTube视频基础架构的新时代。首席软件工程师Jeff Calow带领我们创建了一个开创性的系统,该系统为我们的平台提供了强大的支持,使我们的观众人数激增,并将带领我们走向未来。
LiveVideoStack
2021/09/01
5900
论文阅读——YouTube的视频推荐系统
《The YouTube video recommendation system》是一篇详细介绍YouTube视频推荐的论文,在整个系统中没有复杂的算法,使用了一些简单有效的策略,这也符合工业界的应用,在工业界,为了考虑算法复杂度,数据量,可维护性等等一些因素,在工业界中,通常会选择一些简单有效的方法。
felixzhao
2019/01/31
1.2K0
论文阅读——YouTube的视频推荐系统
点击加载更多

相似问题

软件工程术语的需求本体

13

C标准中的条件特性是什么?

24

测试框架的标准特性是什么?

11

非交互式功能需求软件工程

117

将需求映射到Redmine中的特性的最佳方法是什么?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档