再次点击当前标签栏时如何在 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 中滚动到顶部?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 RxSwift 中观察 UITableView 点击/选择的先前值和当前值?