启动 UITableView 滚动到底部

Posted

技术标签:

【中文标题】启动 UITableView 滚动到底部【英文标题】:Start UITableView scrolled to bottom 【发布时间】:2016-08-28 22:47:30 【问题描述】:

如何启动滚动到最后一个单元格的UITableView

没有动画 视图出现后没有 在表格视图甚至添加为子视图之后

只要有一个简单的UITableView(frame: CGRectZero, style: UITableViewStyle.Plain),当它出现在屏幕上时,就会开始一直滚动到底部。

我试过了:

// 1
reloadData()
scrollToRowAtIndexPath(
    NSIndexPath(forItem: dataArray.count-1, inSection: 0),
    atScrollPosition: .Top, animated: false
)

// 2
reloadData()
var contentOffset = self.contentOffset
contentOffset.y = CGFloat.max
setContentOffset(contentOffset, animated: false)

tableView 的init 方法(在我的子类中)

我也尝试了经典的CGAffineTransformMakeScale(1,-1) hack,但这会使我的单元格粘在底部,我希望它们粘在顶部(但滚动到底部)。 (仅当我的单元格很少,当它们没有填满整个 UITableView 空间时才相关)

编辑:另一个细节,我正在使用动态单元格UITableViewAutomaticDimension

【问题讨论】:

参考developer.apple.com/library/ios/documentation/UIKit/Reference/…:我想这就是你要找的。只需将动画设置为 false。 对于第一个,尝试将 atScrollPosition 设置为 .Bottom。 只需在viewDidLoad 中调用tableView.setContentOffset(CGPointMake(0, CGFloat.max), animated: false) @Kendel 这是我的第二次尝试。 @penatheboss 试过 =/。 @ozgur 我这里没有viewDidLoad,我只使用了UITableView,它将被添加到另一个已经加载的视图中(但只是为了放弃这种可能性,我也有相同的代码使用常规UITableViewController 仍然遇到同样的问题)。 【参考方案1】:

这将滚动到底部而不会出现任何故障,但是如果您使用 Tableview 滚动到行属性,则会出现故障。

对于 Swift 3 使用

self.TableView.reloadData() // To populate your tableview first
//Since we have to wait until the table is reload
 DispatchQueue.main.async 
 let bottomOffset = CGPoint(x: 0, y: self.TableView.contentSize.height - self.TableView.frame.size.height)
 self.TableView.setContentOffset(bottomOffset, animated: false)
 

对于Objective C使用

[YourTableView reloadData]; // To populate your tableview first

[YourTableView setContentOffset:CGPointMake(0, YourTableView.contentSize.height - YourTableView.frame.size.height)];

【讨论】:

也许 swift : -- : [YourTableView setContentOffset:CGPointMake(0, YourTableView.contentSize.height - YourTableView.frame.size.height) animated:NO]; 上面的代码不是在底部精确滚动,它从底部向上接近 150 px。你知道吗? @guru :它将完全滚动到底部,您需要检查的是您的数据是否在 self.TableView.setContentOffset() 函数之前完全加载。点击此链接寻求帮助:***.com/questions/16071503/… 欢迎@guru :) 如果您认为答案是正确的,请投票支持,这样它也可以帮助其他开发人员。谢谢【参考方案2】:

编辑

动画:假

func scrollBottom() 
    let lastIndex = NSIndexPath(forRow: dataArray.count-1, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)

测试代码:

import UIKit

class TableViewController: UITableViewController 

var goButton = UIButton()

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    goButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
    goButton.backgroundColor = UIColor.blueColor()
    goButton.addTarget(self, action: #selector(TableViewController.scrollBottom), forControlEvents: .TouchUpInside)
    self.view.addSubview(goButton)




override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return 500



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = "Hello, World!"

    return cell


func scrollBottom() 
    let lastIndex = NSIndexPath(forRow: 499, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)



【讨论】:

就像我在问题中所说的那样,我不希望它被动画化。 现在使用动态单元格,我希望在显示视图之前滚动,您在用户已经看到所有内容之后才这样做【参考方案3】:

您可以设置内容偏移量:

tableview.contentOffset = CGPoint(x: ??, y: ??)

或滚动到所需的行

tableview.contentOffset.scrollToItem(at: IndexPath(row: tableview.contentOffset.numberOfItems(inSection: 0) - 1, section: 0), at: .bottom, animated: false)

要在视图出现之前让用户看不到转换,只需在视图控制器的 viewDidLayoutSubviews() 生命周期方法中调用这些方法即可。

【讨论】:

以上是关于启动 UITableView 滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

检测 UITableView 何时滚动到底部

UITableView 不滚动到底部(Swift IOS)

UITableView 从当前位置滚动到底部

iOS UITableView如何禁用滚动到底部弹跳

如何让 UITableView 在动态高度单元格中滚动到底部?

Swift - UITableView 滚动到底部很慢