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

时间:2013-11-18 16:29:07

标签: ios objective-c uitableview uitabbarcontroller

我正在尝试复制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)向上滚动但停在搜索栏之外并部分切断第一行。我假设这与导航栏的工作原理有关吗?

第二个实现(scrollRectToVisible)第一次工作但是如果我稍后回到搜索选项卡则会变得很糟糕。

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

更新:SearchBar是UITableView的一部分。

3 个答案:

答案 0 :(得分:3)

您可以尝试:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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