【问题标题】:How to redraw custom collection layout when keyboard is visible?键盘可见时如何重绘自定义集合布局?
【发布时间】:2020-03-06 21:53:01
【问题描述】:

我有自定义集合布局来使用 uicollectionview 绘制单元格。每个集合视图单元格都有输入文本视图。当用户输入文本时需要调整单元格高度。所以我称集合视图无效布局。但它会重绘准备布局中的所有部分和行,并自动关闭键盘。我想保持键盘直到用户点击关闭按钮。当用户输入文本时需要增加单元格的高度。

我选择自定义布局的原因是我的应用需要 uicollectionview 中的行跨度和列跨度选项(合并和取消合并单元格)。这不能在普通的 uicollectionviewflowlayout 中实现。谁能帮我就这个问题提出建议?

【问题讨论】:

    标签: ios uicollectionview uicollectionviewlayout ios12


    【解决方案1】:

    关于重绘

    我当前的应用中有一个自定义布局。它由各种单元格组成,包括带有文本字段的单元格。我开始编辑带有字段的单元格,出现键盘。然后我按下另一个可见的愿望清单单元格上的按钮,将产品添加到愿望清单。添加产品后,我使布局无效并重新加载愿望清单单元格。在所有这些操作过程中,现场单元仍然是第一响应者,而键盘无处可去。

    但它会重新绘制准备布局中的所有部分和行,并自动关闭键盘

    你确定你没有打电话给reloadData()吗?重绘一切的不是布局,通常是开发者调用reloadData()。

    我想让键盘一直保持到用户点击关闭按钮。

    因此,如果您从 reloadData() 切换到 batch updates - 键盘将保留。

    关于调整大小

    当您使布局无效时,您为单元格准备了新属性。具有新尺寸/框架的属性。但是数据源是一样​​的。这意味着UICollectionView 只会移动单元格,但不会重新加载它们。你不必重新加载任何东西!只是使无效并提供新属性。字段单元格将自动增长。

    示例

    在关于重绘中,我描述了我重新加载愿望单元格的方式。另外,我添加了字段属性大小更改。您现在可以看到键盘仍然存在并且字段单元格大小发生了变化。现在看起来是这样的:

    所以,我相信,您只需要处理布局即可。可以实现所需的行为。祝你好运,编码愉快(:

    【讨论】:

    • 是的。我在我的应用程序中也看到了这种行为。我的困难部分是当我的单元格文本视图位于 uicollectionview 的底部时。当用户在 uitextview 中获得焦点时,我已将我的集合视图内容偏移 y 位置移动到顶部以进行键盘调整(否则键盘可以隐藏输入字段)。在这种情况下,当用户输入长文本或输入新行时,我想增加 uitextview 高度,因此我使集合布局无效。所以每次重绘集合视图内容偏移量都会达到 0,0。所以用户看不到uitextview的可见性(因为当它重绘时它会走到底部)。
    • 如果我在布局无效后手动将内容偏移设置为顶部。应用程序显示一些闪烁效果。抱歉,键盘没有关闭。我没有使用集合视图 invalidatelayout 调用 reloadData。我只想在调用无效布局时重新加载而不使用任何动画。
    • 对此有何建议?
    • 我现在没有什么可以建议的。我会考虑您的问题并尝试提供建议。
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2019-02-07
    • 2011-07-02
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2016-04-04
    • 2013-10-13
    相关资源
    最近更新 更多