滚动时保持 UITableViewCell 可见? (斯威夫特 3)

Posted

技术标签:

【中文标题】滚动时保持 UITableViewCell 可见? (斯威夫特 3)【英文标题】:Keep a UITableViewCell visible when scrolling? (Swift 3) 【发布时间】:2016-11-25 01:06:23 【问题描述】:

是否可以在滚动时使单个UITableViewCell 在屏幕上保持可见(例如,当您向下滚动时,单元格应始终在屏幕顶部保持可见)。我含蓄地问我是否可以使用单元格执行此操作,所以不要费心建议我应该使用表格视图页眉或页脚,因为我在这个网站上被告知不可能在页脚或页眉视图中为视图设置动画,我真的需要在表格视图中为子视图设置动画的能力(显然只能在单元格中完成)。

换个说法:当您向上或向下滚动时,是否可以以任何方式保持表格视图中的单元格始终可见?如果没有,是否有一个“技巧”来为页脚或页眉内的视图设置动画?因为就像我说的那样,我被告知没有“合法”的方式可以做到这一点。

如果这是错误的,请纠正我。谢谢!

更新: 在我之前制作的一些 cmets 上纠正自己:似乎可以在页脚视图中为子视图设置动画,但它与在表格视图中为单元格设置动画的方式不同,所以如果有人知道如何在里面提交动画页脚视图,请随时提出一些建议。调用表格视图的reloadData() 方法对表格视图单元格有效,但页脚视图完全忽略UIView.animate(withDuration:) 并立即显示布局更改而不对其进行动画处理。

更新:

if self.didTapOnButton == true 
        self.view.layoutIfNeeded()
        UIView.animate(withDuration: 0.3, animations: 
            bubbleView.backgroundColor = UIColor(red: 255/255, green: 225/255, blue: 68/255, alpha: 1)
            containerViewTrailingConstraint.constant = 5
            iconImageViewTrailingConstraint.constant = 5
            bubbleViewEqualWidthConstraint.constant = 0
            self.view.layoutIfNeeded()
        , completion:  (done:Bool) in
            UIView.animate(withDuration: 0.2, animations: 
                textView.alpha = 1
                doneButton.alpha = 1
            , completion:  (done:Bool) in
                textView.becomeFirstResponder()
            )
        )
        self.didTapOnButton = false
    

触发动画的代码。当点击按钮时self.didTapOnButton 设置为true,然后立即重新加载表格视图,因此此代码执行一次(注意self.didTapOnButton 在动画完成后重新设置为false)。不过,问题似乎不太可能出现在这段代码中,因为当单元格仍在表格视图中而不是表格视图的页脚时,它可以完美运行。

【问题讨论】:

您的意思是说“表格视图 section 标题”吗?我问是因为它们是具有内置所需粘性功能的视图(也因为我很确定可以在表格视图标题内设置动画)。你有一个链接到你读到的那是不可能的吗? 是的,我就是这个意思。找不到链接,很久以前的,所以可能被删除了,它是用不同的帐户。更具体地说,我想在 FOOTER 部分而不是标题内设置动画。你知道怎么做吗?调用reloadData() 可以使单元格动画,但页脚不能。在动画块中的页脚更改会立即发生而无需动画。 我刚刚添加了一个包含动画 CALayer 的测试 UIView 子类,它运行良好。你想实现什么样的动画? @Paulw11 我有一个限制在单元格内容视图的所有四个边缘的视图(顺便说一下,我使用 UITableViewCell 作为页脚视图,因为我已经将此单元格设置为最初我的表格视图的底部单元格)。当视图加载时,视图的前导约束常量设置为 250,因此视图看起来像屏幕右侧的一个小方块。在动画块中(当点击按钮时),常量设置为 0,因此正方形应该再次“扩展”到屏幕的全宽(就像我最初在情节提要中设置的那样)。你能想象一下它的样子吗? 是的。你能展示你的动画块吗?什么触发了动画(即按钮在哪里?) 【参考方案1】:

由于您尝试为 viewForFooterInSection 中的视图设置动画,但此时页脚视图还不是视图层次结构的一部分,因此不会发生动画。在此函数返回后添加页脚视图,您只会看到动画后视图。

通常我不喜欢这种基于时间的“黑客”,但这将通过在页脚视图到位后执行动画来解决您的问题,我想不出任何其他可靠的方法.

if self.didTapOnButton == true 
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) 
        self.view.layoutIfNeeded()
        UIView.animate(withDuration: 0.3, animations: 
            bubbleView.backgroundColor = UIColor(red: 255/255, green: 225/255, blue: 68/255, alpha: 1)
            containerViewTrailingConstraint.constant = 5
            iconImageViewTrailingConstraint.constant = 5
            bubbleViewEqualWidthConstraint.constant = 0
            self.view.layoutIfNeeded()
        , completion:  (done:Bool) in
            UIView.animate(withDuration: 0.2, animations: 
                textView.alpha = 1
                doneButton.alpha = 1
            , completion:  (done:Bool) in
                textView.becomeFirstResponder()
            )
        )
        self.didTapOnButton = false
    

【讨论】:

是的!就是这样!有效!太感谢了!愚蠢的事情就在不久前,我修复了另一个问题,UIAlertController 在以完全相同的方式呈现后立即消失,所以我现在因为之前没有想到这一点而脸红。我猜这些基于时间的技巧就像一个 Z 计划,你可以在没有其他方法的情况下实施。在愚蠢的布局问题上整天挠头之后,这是第二次救命稻草。再次感谢!哦,顺便说一句,我不需要你的代码中的 + 0.1 秒,只是 .now() 为我做了诀窍。为我节省了十分之一秒 :)

以上是关于滚动时保持 UITableViewCell 可见? (斯威夫特 3)的主要内容,如果未能解决你的问题,请参考以下文章

原型:滚动时保持元素可见

滚动后自定义 UITableViewCell 按钮标题不再可见(重用)

滚动时自定义uitableviewcell空白

Swift UITableViewCell 滚动时按钮状态更改

检测UITableView中当前可见的最后一个UITableViewCell

重新加载 UITableView 有 UITableViewCell 可见性问题