【问题标题】:Animate UITableViewCell height on selection [duplicate]选择时为 UITableViewCell 高度设置动画[重复]
【发布时间】:2010-12-26 06:57:00
【问题描述】:

可能重复:
Can you animate a height change on a UITableViewCell when selected?

我一直在谷歌上搜索,试图找出正确的方法,但到目前为止我很茫然。

我用我自己的视图对 UITableViewCell 进行了子类化,并且我正在尝试为 UITableViewCell 的高度设置动画,以便在选择它时展开,并在再次选择它时收缩。这个表有可能包含数千行,所以我不想覆盖 tableView 的 heightForRowAtIndexPath。理想情况下,我希望一次能够扩展多个细胞,但这并不重要。最好的方法是什么?

谢谢你, 贾斯汀

【问题讨论】:

    标签: iphone objective-c uitableview


    【解决方案1】:

    除了 heightForRowAtIndexPath 之外,没有其他机制可以指定单元格高度。除非您在该方法中正确考虑了扩展单元格,否则您将发现其他单元格在其上方运行或隐藏在其下方。从我忘记设置 heightForRowAtIndexPath 的愚蠢代码中,我很确定您的其他单元格将显示在它上面。

    由于您说的是数千行,我们假设用户无法重新排列单元格。

    您可以做的是在用户点击给定单元格时存储展开单元格的索引路径。然后,heightForRowAtIndexPath 可能如下所示:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
    {
    
    if ([indexPath isEqual:lastSelectedIndexPath])
    {
        return 80;
    }
    
    else {
        return 44;
    }
    
    }
    

    如果你真的想要多个选择,你可以将适当的索引路径存储到一个数组中并像这样检查它们:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
    {
    
    CGFloat cellHeight = 44;
    
    for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray)
    {
        if ([indexPath compare:expandedIndexPath] == NSOrderedSame)
        {
            cellHeight = 80;
            break;
        }
    }
    
    return cellHeight;
    
    }
    

    让动画看起来正确需要一些工作。我已经玩弄了这个特定的 UI 想法有一段时间了,但永远无法让自己坐下来真正实现它。您可以做的一件事是显示一个虚拟视图,当您更新它后面的 tableview 时会产生动画。

    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation
    

    您可能对此感兴趣,因为您可以使用单元格动画来模拟下方单元格的移动以适应您的扩展。

    如果您可以完全放弃为单元格的框架设置动画,则可以在设置新高度后对展开的数据进行不透明动画。

    这是一个硬汉,但如果你让它发挥作用,我敢打赌它会很酷。祝你好运。

    【讨论】:

    • 感谢 Danilo,您让我走上了正确的道路。我最终通过在 didSelectRowAtIndexPath 中使用 reloadRowsAtIndexPaths 让它工作。我检查单元格是否展开并在 heightForRowAtIndexPath 中设置相应的高度,就像您提到的那样。再次感谢!
    • 太酷了!很高兴为您提供帮助。希望它成功。也许我最终会在这些日子里亲自尝试一下。
    • [indexPath compare:expandedIndexPath] == NSOrderedSame 应该写成[indexPath isEqual:expandedIndexPath]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2015-01-19
    • 2011-06-04
    • 2010-10-02
    相关资源
    最近更新 更多