【问题标题】:How to scroll to top in UITableView when the current Tab Bar is tapped again?再次点击当前标签栏时如何在 UITableView 中滚动到顶部?
【发布时间】: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 的一部分。

【问题讨论】:

    标签: ios objective-c uitableview uitabbarcontroller


    【解决方案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”语句中选择正确的索引。我包含了打印功能,因此您可以仔细检查。

      【讨论】:

        猜你喜欢
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多