如何在按钮按下时转到 tableView 的顶部
Posted
技术标签:
【中文标题】如何在按钮按下时转到 tableView 的顶部【英文标题】:how to go to the top of a tableView on button press 【发布时间】:2019-07-27 01:59:59 【问题描述】:我正在使用 swift,我想在按下按钮时转到 tableView 的顶部,就像在 twitter 上按下主页按钮会将你带到你的提要的顶部,到目前为止我还不能找到一个可行的解决方案,这是我尝试过的:
tableView.setContentOffset(.zero, animated: true)
tableView.setContentOffset(CGPoint(x: 0.0, y: -tableView.contentInset.top), animated: true)
func scrollToTop()
let indexPath = IndexPath(row: 0, section: 0)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
所有解决方案只会将您带到任意单元格,如果您也知道在标签栏按钮单击时执行此操作的解决方案,则可以加分
【问题讨论】:
如果您不知道,点击 ios 上的状态栏通常会滚动到屏幕列表的顶部。 How to scroll to the exact end of the UITableView?的可能重复 【参考方案1】:首先,我喜欢你的用户名。
接下来,您发布的解决方案又有什么问题?他们是正确的,除了scrollTo...
内置函数之外,似乎没有比UITableView
或UICollectionView
更好的方法了。并将offset
设置为UIScrollView
。
对于标签栏上点击的处理,你可以做的一件事是继承UITabBarController
,并符合其协议,并实现UITabBarControllerDelegate
所需的方法,例如:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool
.
您可以从那里处理所有事情,然后从那里获取viewController
对象并将其投射到您的家庭类中,然后将视图滚动到顶部。
我为此使用什么功能?和你的差不多,但是有一点条件:
func hasRowAtIndexPath(indexPath: IndexPath) -> Bool
return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
func scrollToTop(animated: Bool)
let indexPath = IndexPath(row: 0, section: 0)
if self.hasRowAtIndexPath(indexPath: indexPath)
self.scrollToRow(at: indexPath, at: .top, animated: animated)
此外,请尝试点击应用的状态栏,看看它会将您带到哪里。
【讨论】:
状态栏有效,但我尝试的那些解决方案只会占用几个单元格,而不是一直到顶部 如果有表格视图标题和/或部分标题,则不会滚动到顶部。 @Stopdownvotingmeplease 你试过这个吗? : tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: tableView.frame.width, height: tableView.frame.height), 动画: true)【参考方案2】:我再次编辑了我的答案,没有涉及 indexPath:
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad()
super.viewDidLoad
@IBAction func button(_ sender: UIButton)
myButton.isSelected = !myButton.isSelected
tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: tableView.frame.width, height: tableView.frame.height), animated: true)
override func scrollViewWillBeginDragging(_ scrollView: UIScrollView)
if myButton.isSelected
print("SUCCESS 1")
override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
if myButton.isSelected
myButton.isSelected = false
print("SUCCESS 2")
【讨论】:
如果有表格视图标题和/或部分标题,则不会滚动到顶部。【参考方案3】:我猜问题是按钮函数中的一些其他逻辑与 scrollToTop()
函数混淆了,这段代码有效:
func scrollToTop()
tableView.setContentOffset(.zero, animated: true)
@IBAction func BlogPressed(_ sender: Any)
if(BlogIndicator.alpha == 1.0)
scrollToTop()
else
articleRefresh()
self.articleArray = self.blogArray
BlogIndicator.alpha = 1.0
NewsIndicator.alpha = 0.0
RosterIndicator.alpha = 0.0
DraftIndicator.alpha = 0.0
tableView.reloadData()
但我仍在寻找一种解决方案,以便在按下标签栏按钮时转到表格视图的顶部
【讨论】:
以上是关于如何在按钮按下时转到 tableView 的顶部的主要内容,如果未能解决你的问题,请参考以下文章
当点击自定义 TableView 单元格中的 UITextField 时转到新视图
在 UITableView 顶部按下时,UIButton 不会更改其状态
按下时使用 UIViewAnimationTransitionFlipFromRight 翻转 UIButton 并在“另一侧”显示新按钮