启动 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 滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章