再次点击当前标签栏时如何在 UITableView 中滚动到顶部?

Posted

技术标签:

【中文标题】再次点击当前标签栏时如何在 UITableView 中滚动到顶部?【英文标题】:How to scroll to top in UITableView when the current Tab Bar is tapped again? 【发布时间】:2013-11-18 16:29:06 【问题描述】:

我正在尝试复制 App Store 搜索功能,在该功能中,再次点击搜索标签栏,将搜索结果滚动回第一个。

我的情况更简单,因为它是一个传统的表格视图,所以它需要滚动到顶部。我设置了 UITabBarControllerDelegate 并且可以检测标签栏的选择。

在didSelectViewController中,我试过了:

- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
  if(viewController == tabBarController.selectedViewController) 
    [searchResultsTable setContentOffset:CGPointZero animated:YES];
  

[searchResultsTable scrollRectToVisible:tableOrigin animated:YES];

其中 tableOrigin 是我在 viewDidLoad 中设置的表格视图框架矩形。

第一个实现 (setContentOffset) 向上滚动但在搜索栏附近停止并部分切断第一行。我假设这与 ios 7 导航栏的工作方式有关?

第二个实现(scrollRectToVisible)第一次工作,但如果我稍后回到搜索选项卡就会变得不稳定。

是否有可靠、可重复的视图来模仿“滚动到顶部”功能,就像它以编程方式点击状态栏的方式一样,并且不会切断 iOS 7 中的任何行或搜索栏?

更新:SearchBar 是 UITableView 的一部分。

【问题讨论】:

【参考方案1】:

你可以试试:

[searchResultsTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 
                                                              inSection:0]
                          atScrollPosition:UITableViewScrollPositionTop
                                  animated:YES];

【讨论】:

这就像setContentOffset:CGPointZero 一样工作,将您带到第一行。 SearchBar 仍处于隐藏状态,并且不会复制您在点击状态栏时获得的内容(将您完全带到顶部)。【参考方案2】:

你没有做错任何事。尝试在视图上运行setNeedsUpdateConstraints。如果这不能解决问题,请尝试[self.view updateConstraints]

【讨论】:

【参考方案3】:

SWIFT 3

只需将collectionView改为tableView

首先在类中实现UITabBarControllerDelegate,并确保在viewDidLoad中设置了委托

class DesignStoryStreamVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITabBarControllerDelegate 

 @IBOutlet weak var collectionView: UICollectionView!

 override func viewDidLoad() 
        super.viewDidLoad()

        self.tabBarController?.delegate = self

        collectionView.delegate = self
        collectionView.dataSource = self
    

接下来,把这个委托函数放在你的类中的某个地方。

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) 

    let tabBarIndex = tabBarController.selectedIndex

    print(tabBarIndex)

    if tabBarIndex == 0 
        self.collectionView.setContentOffset(CGPoint.zero, animated: true)
    

确保在“if”语句中选择正确的索引。我包含了打印功能,因此您可以仔细检查。

【讨论】:

以上是关于再次点击当前标签栏时如何在 UITableView 中滚动到顶部?的主要内容,如果未能解决你的问题,请参考以下文章

编辑搜索栏时将 UITableView 添加到子视图

通过点击状态栏滚动到 UITableView 的顶部

如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?

如何限制从顶部定位我的标签,但在隐藏导航栏时不让它移动(因为它会调整视图高度)?

快速展开和收缩 UITableView 一行

目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?