UITableView将行锚定到底部

时间:2011-04-15 16:42:13

标签: iphone uitableview

我有一个需要从底部引入新内容的UITableView。这是视图已满时表视图的行为方式,并添加了带动画的新行。

我是通过改变contentInset来启动它的,因为引入了行但是当它们改变了一些东西时,条目动画都是错误的...这种方法的问题因为用户可以删除行而更加复杂,并且行内容更新,导致它们调整大小(每行都有自己的高度,这会改变)。

有关如何将UITableView行始终显示在UITableView视图空间底部的任何建议?

11 个答案:

答案 0 :(得分:71)

我有一个完美适合我的解决方案,但它引起了一堆双重思考,所以它在理论上并不像在实践中那么简单......有点......

步骤1,将变换应用于旋转180deg的表视图

tableView.transform = CGAffineTransformMakeRotation(-M_PI);

步骤2,在tableView中旋转原始单元格180deg:cellForRowAtIndexPath:

cell.transform = CGAffineTransformMakeRotation(M_PI);

第3步,反转您的数据源。如果您正在使用NSMutableArray在位置0插入新对象而不是使用AddObject ...

现在,困难的部分是记住左边是右边,只留在桌面上,所以如果你使用

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationLeft]

现在必须是

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationRight]

和删除等相同

根据您的数据存储的不同,您可能还需要按相反的顺序处理...

注意:旋转单元格OPPOSITE表,否则浮点虚空可能会导致变换完美,并且当你滚动时,你会不时地对某些图形进行爬行......轻微而烦人。

答案 1 :(得分:39)

接受的方法为我的应用程序引入了问题 - 滚动条位于错误的一侧,并且它为UITableViewStyleGrouped破坏了单元格分隔符

要解决此问题,请使用以下

tableView.transform = CGAffineTransformMakeScale (1,-1);

cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
// if you have an accessory view
cell.accessoryView.transform = CGAffineTransformMakeScale (1,-1); 

答案 2 :(得分:16)

类似于ima747的方法,但旋转180度也会使滚动指示器转向另一侧。相反,我垂直翻转了表格视图及其单元格。

self.tableView.transform = CGAffineTransformMakeScale(1, -1); //in viewDidLoad

cell.transform = CGAffineTransformMakeScale(1, -1);//in tableView:cellForRowAtIndexPath:

答案 3 :(得分:2)

创建一个表格标题,它是屏幕的高度(无论您处于何种方向),您希望可见的行的高度。如果没有行,则标题是表视图的完整高度。添加行时,同时将表头的高度减小新行的高度。这意味着更改为表头提供的视图框架的高度。重点是填充表格行上方的空白,以提供行从底部进入的外观。使用表头(或节头)将表数据向下推。您可以在标题视图中添加任何您喜欢的内容,如果您愿意,也可以将其设置为空白和透明。

我认为这应该具有您正在寻找的效果。

查看属性tableHeaderView。您只需将其设置为要在表头中显示的视图。然后,您可以在添加行时根据需要对其进行操作。我不记得你需要多么强大才能让视图在UI中实际更新。可能就像调用setNeedsDisplay一样简单。

或者,查看方法tableView:viewForHeaderInSection:tableView:heightForHeaderInSection:。与使用表头视图类似,您可能希望拥有一次设置的实例变量,但您可以从这些方法访问以分别返回视图本身或其高度。当您需要更改(第一个)部分的视图时,可以在更改视图高度(或内容)后使用reloadSections:withAnimation:强制更新屏幕上的视图。

这有什么意义吗?希望如此。 : - )

答案 4 :(得分:2)

Swift 3.01 - 其他解决方案可以是,旋转和翻转表格视图。对我来说非常好用,而且不会弄乱动画,并且在表格视图上重新加载数据的工作量较少。

self.tableView.transform = CGAffineTransform.init(rotationAngle: (-(CGFloat)(Double.pi)))
self.tableView.transform = CGAffineTransform.init(translationX: -view.frame.width, y: view.frame.height)

答案 5 :(得分:0)

我只想在UICollectionView上使用这种技术的所有这些答案中添加一些内容...有时当布局无效时,我的单元格会以错误的方式转换回来,我发现在UICollectionViewCell和UICollectionReusableView子类中我不得不这样做:

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [super applyLayoutAttributes:layoutAttributes];
    [self setTransform:CGAffineTransformMakeScale(1, -1)];
}

答案 6 :(得分:0)

dataSourceArray = dataSourceArray.reversed()

tableView.transform = CGAffineTransform(scaleX: 1, y: -1)

cell.transform = CGAffineTransform(scaleX: 1, y: -1)


func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let text = textField.text {
        dataSourceArray.insert(text, at: 0)
        self.tableView.reloadData()
        textField.text = ""
    }
    textField.resignFirstResponder()
    return true
}

答案 7 :(得分:0)

一种更简单的方法是在cellForRowAtIndexPath的底部添加以下行

if(indexPath.section == self.noOfSections - 1)
    [self scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self numberOfRowsInSection:self.noOfSections -1] - 1) inSection:self.noOfSections -1] atScrollPosition:UITableViewScrollPositionBottom animated:animated];

答案 8 :(得分:0)

晚些时候参加聚会,但是受@Sameh Youssef的想法启发,假设您只有一个部分,则该功能可滚动到表视图的最后一个单元格。如果没有,则只返回部分的数目,而不是对0进行硬编码。

任意选择微秒延迟。

 func scrollToLast() {
        DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(5)) {
            let lastIndex = IndexPath(row: self.tableView.numberOfRows(inSection: 0) - 1, section: 0)
            if lastIndex.row != -1 {
                self.tableView.scrollToRow(at: lastIndex, at: .bottom, animated: false)
            }
        }
}

答案 9 :(得分:0)

我建议使用this博客文章中描述的方法。 已经在iOS 12和13上进行了检查。完美运行。

答案 10 :(得分:-2)

好吧,如果你用NSMutableArray加载你的tableview,我建议你按逆序排序数组。因此,表格视图将按您的要求填写。