UITableView锚定行到底部

| 我有一个UITableView,需要从底部开始引入新内容。当表视图已满并且使用动画添加新行时,这就是表视图的行为。 我是通过在引入行时更改contentInset来开始的,但是当它们改变时,事情就消失了,并且输入动画都是错误的...这种方法的问题在于用户可以删除行,而行又使这一问题更加复杂内容更新,导致它们调整大小(每行都有其自己的高度,该高度会发生变化)。 关于如何使UITableView行始终显示在UITableView的视图空间底部的任何建议?     
已邀请:
我有一个非常适合我的解决方案,但是它引起了一堆双重思考,因此理论上不像实际中那么简单...有点... 步骤1,将转换应用于表格视图,将其旋转180度
tableView.transform = CGAffineTransformMakeRotation(-M_PI);
第2步,将原始单元格在tableView:cellForRowAtIndexPath中旋转180度:
cell.transform = CGAffineTransformMakeRotation(M_PI);
步骤3,反转您的数据源。如果您使用的是NSMutableArray,请在位置0处插入新对象,而不要使用AddObject ... 现在,最困难的部分是要记住,左是右,而右是左仅在表级别,所以如果使用
[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationLeft]
现在必须
[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationRight]
与删除等相同 根据您的数据存储区的不同,您可能还必须以相反的顺序处理它。 注意:将单元格旋转到与表格相对的位置,否则浮点数不确定会导致转换无法完美进行,并且在滚动时会不时出现某些图形上的爬行现象,虽然很小但是很烦人。     
可接受的方法给我的应用程序带来了问题-滚动条位于错误的一侧,并且它破坏了UITableViewStyleGrouped的单元格分隔符 要解决此问题,请使用以下命令
tableView.transform = CGAffineTransformMakeScale (1,-1);
cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
// if you have an accessory view
cell.accessoryView.transform = CGAffineTransformMakeScale (1,-1); 
    
与ima747相似的方法,但是旋转180度也会使滚动指示器转到相反的一侧。相反,我垂直翻转了表格视图及其单元格。
self.tableView.transform = CGAffineTransformMakeScale(1, -1); //in viewDidLoad

cell.transform = CGAffineTransformMakeScale(1, -1);//in tableView:cellForRowAtIndexPath:
    
创建一个表格标题,该标题是屏幕的高度(无论您处于什么方向),要少一些要显示的行的高度。如果没有行,则标题为表格视图的完整高度。添加行时,同时将表标题的高度减少新行的高度。这意味着更改为表标题提供的视图框架的高度。关键是要填充表格行上方的空间,以使行看起来从底部进入。使用表头(或节头)可将表数据下推。您可以在标题视图中放置任何内容,甚至可以将其空白和透明。 我认为,这应该会产生您想要的效果。 看一下属性“ 7”。您只需将其设置为要在表标题中显示的视图即可。然后,您可以在添加行时根据需要进行操作。我想不起来您需要多么强大才能使视图在UI中实际更新。可能就像调用ѭ8一样简单(如果有的话)。 或者,查看方法
tableView:viewForHeaderInSection:
tableView:heightForHeaderInSection:
。与使用表头视图类似,您希望拥有一个实例变量,该实例变量只需要设置一次,但是可以从这些方法访问以分别返回视图本身或其高度。当需要更改(第一个)部分的视图时,可以在更改视图高度(或内容)后使用
reloadSections:withAnimation:
强制更新屏幕上的视图。 有什么道理吗?希望如此。 :-)     
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)
    
我只是想向所有这些答案中添加一些有关在UICollectionView中使用此技术的信息...有时在使布局无效时,我的单元格将以错误的方式转换回去,我发现在UICollectionViewCell和UICollectionReusableView子类中,我不得不做这个:
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [super applyLayoutAttributes:layoutAttributes];
    [self setTransform:CGAffineTransformMakeScale(1, -1)];
}
    
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
}
    
一种更简单的方法是在ѭ15的底部添加以下行
if(indexPath.section == self.noOfSections - 1)
    [self scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self numberOfRowsInSection:self.noOfSections -1] - 1) inSection:self.noOfSections -1] atScrollPosition:UITableViewScrollPositionBottom animated:animated];
    
好吧,如果您使用NSMutableArray加载表格视图,我建议您以相反的顺序对数组进行排序。因此,表视图将按您的意愿填充。     

要回复问题请先登录注册