如何从底部向上填充UITableView?

kai*_*lor 29 iphone objective-c uitableview ios ios8

是否可以颠倒tableView的顺序.我已经搜索了很多解决方案,但所有结果都不是我想要实现的解决方案.他们都建议滚动到表的最后一个位置scrollToRowAtIndexPath并反向填充数据.但是,如果表内容是动态的,并且在某些情况下并非所有单元都有数据,则这不起作用.例如,在普通的tableView中,顺序是:


标签1

标签2

标签3

滚动方向
v
V.


期望的结果是:
滚动方向
^
^

标签3

标签2

标签1


在这个例子中,如果我使用建议的方法scrollToRowAtIndexPath并使用对象数组的长度,我只会从顶部获得第三个单元格.并最终得到这样的东西:


意外结果:

标签3

标签2

标签1

滚动方向
v
V.


任何帮助都会非常感谢你.

Kli*_*akM 30

要从底部填充表,请使用以下命令:

- (void)updateTableContentInset {
    NSInteger numRows = [self tableView:self.tableView numberOfRowsInSection:0];
    CGFloat contentInsetTop = self.tableView.bounds.size.height;
    for (NSInteger i = 0; i < numRows; i++) {
        contentInsetTop -= [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
        if (contentInsetTop <= 0) {
            contentInsetTop = 0;
            break;
        }
    }
    self.tableView.contentInset = UIEdgeInsetsMake(contentInsetTop, 0, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

要反转元素的顺序,请使用:

dataSourceArray = dataSourceArray.reverseObjectEnumerator.allObjects;
Run Code Online (Sandbox Code Playgroud)

Swift 2.2版本(更新):

func updateTableContentInset() {
    let numRows = tableView(self.tableView, numberOfRowsInSection: 0)
    var contentInsetTop = self.tableView.bounds.size.height
    for i in 0..<numRows {
        let rowRect = self.tableView.rectForRow(at: IndexPath(item: i, section: 0))
        contentInsetTop -= rowRect.size.height
        if contentInsetTop <= 0 {
            contentInsetTop = 0
        }
    }
    self.tableView.contentInset = UIEdgeInsets(top: contentInsetTop,left: 0,bottom: 0,right: 0)
}
Run Code Online (Sandbox Code Playgroud)

Swift 3.0 +/4.0版本(更新):

self.tableView.contentInset = UIEdgeInsetsMake(contentInsetTop, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,当您在可以具有动态高度的UITableViewCells上使用AutoLayout时,此解决方案将无法工作. (5认同)
  • 任何适用于自动布局/动态单元高度的解决方案? (4认同)
  • 语法和逻辑从3.0开始改变了?我得到:`不能调用非函数类型的值'UITableView!'`*语法改变了*line:`tableView(self.tableView,heightForRowAt:IndexPath(item:i,section:0))` (3认同)

小智 13

首先反转uitableview

    tableView.transform = CGAffineTransformMakeScale (1,-1);
Run Code Online (Sandbox Code Playgroud)

然后在细胞中反转细胞.

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

    ...

    cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
Run Code Online (Sandbox Code Playgroud)


Akb*_*han 8

Swift 4.0和4.2版本

viewDidLoad中的第一个反向UITableView

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.transform = CGAffineTransform(scaleX: 1, y: -1)
}
Run Code Online (Sandbox Code Playgroud)

然后反转cellForRowAt中的单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as? MyTableViewCell else { fatalError() }

        cell.contentView.transform = CGAffineTransform(scaleX: 1, y: -1)
        return cell
    }
Run Code Online (Sandbox Code Playgroud)