UITableView将行锚定到底部
我有一个UITableView需要从底部引入新的内容。 这是视图充满时表视图的行为方式,您可以使用animation添加新行。
我开始通过改变contentInset作为行介绍,但是当他们改变事情发生了,入口animation都是错误的…我用这种方法的问题是复杂的事实,用户可以删除行,行内容更新,导致它们resize(每一行都有自己的高度发生变化)。
有关如何让UITableView行总是出现在UITableView视图空间底部的build议?
我有一个完全适合我的解决scheme,但是它引起了一堆双重的思考,所以它在理论上不像在实践中那么简单…还挺…
步骤1,将旋转180度的表格视图应用一个变换
tableView.transform = CGAffineTransformMakeRotation(-M_PI);
第2步,在tableView:cellForRowAtIndexPath中旋转180deg的原始单元格:
cell.transform = CGAffineTransformMakeRotation(M_PI);
第3步,反转你的数据源。 如果您正在使用NSMutableArray插入位置0的新对象,而不是使用AddObject …
现在,困难的部分是记住,左边是正确的,右边只在桌面上,所以如果你使用
[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationLeft]
它现在必须是
[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationRight]
删除等相同
取决于你的数据存储是什么,你可能不得不以相反的顺序处理…
注意:旋转单元格OPPOSITE的表,否则浮点innacuracy可能会导致变换完美,你会得到一些graphics时不时爬,你滚动…次要的,但烦人的。
接受的方法引入了我的应用程序的问题 – 滚动条是错误的一面,它扭曲了单元格分隔符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:
创build一个表格标题,它是屏幕的高度(无论你在哪个方向),只要你想要看到的行的高度。 如果没有行,则表头是表视图的整个高度。 在添加行时,同时将表格标题的高度降低新行的高度。 这意味着改变您为表格标题提供的视图框架的高度。 问题的关键在于填充表格行上方的空间,以显示行从底部进入。 使用表头(或节头)将表数据向下推。 你可以把任何你喜欢的标题视图,即使它是空白和透明的,如果你喜欢。
这应该有你正在寻找的效果,我想。
看看属性tableHeaderView
。 您只需将其设置为您希望显示在表格标题中的视图。 然后,您可以在添加行时根据需要操作它。 我不记得你是多么有力,才能在UI中实际更新视图。 如果有的话,可能就像调用setNeedsDisplay
一样简单。
或者,查看方法tableView:viewForHeaderInSection:
和tableView:heightForHeaderInSection:
tableView:viewForHeaderInSection:
类似于使用表头视图,您希望有一个实例variables,您可以设置一次,但您可以从这些方法访问分别返回视图本身或其高度。 当您需要更改(第一个)部分的视图时,可以使用reloadSections:withAnimation:
在更改视图高度(或内容)后强制更新屏幕上的视图。
任何有意义的? 但愿如此。 🙂
Swift 3.01 – 其他解决scheme可以是,旋转和翻转表视图。 对我来说工作得非常好,而且不会弄乱animation,对于重新加载数据在表格视图上的工作要less一些。
self.tableView.transform = CGAffineTransform.init(rotationAngle: (-(CGFloat)(M_PI))) self.tableView.transform = CGAffineTransform.init(translationX: -view.frame.with, y: view.frame.hight)
我只是想添加一些东西到所有这些答案关于使用这种技术与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 }
那么,如果你用NSMutableArray加载你的tableview,我build议你按相反顺序排列数组。 所以表格视图会像你想要的那样填满。