通过点击状态栏滚动到顶部 TableView 不起作用(有很多子视图)SWIFT
Scroll to top TableView by tapping status bar not work (with many subviews) SWIFT
我有很多视图,每个视图都有很多子视图。
我试图为每个子视图指定
scrollsToTop = false
但是我的 TableView
在我按下状态栏时没有滚动到顶部。
我想我错过了一些观点...
我知道有一个类似的 post 但它没有回答 (UITableView scroll to top when tapping status bar at top of the screen)
所以我决定实现这个功能:
override func viewDidLoad() {
super.viewDidLoad()
checkForScrollViewInView(self.view)
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.scrollsToTop = true
}
func checkForScrollViewInView(view:UIView) {
for subview in view.subviews as [UIView] {
if subview.isKindOfClass(UITextView) {
(subview as! UITextView).scrollsToTop = false
}
if subview.isKindOfClass(UIScrollView) {
(subview as! UIScrollView).scrollsToTop = false
}
if subview.isKindOfClass(UITableView) {
(subview as! UITableView).scrollsToTop = false
}
if (subview.subviews.count > 0) {
self.checkForScrollViewInView(subview)
}
}
}
但是也行不通。我不知道我想念什么。
您可能会遇到两个问题:
- 您有多个
UIScrollView
实例。您应该为父 UIScrollView
或从它继承的对象(如 UITableView
或 UICollectionView
禁用 scrollsToTop
(例如 viewDidLoad
中的 self.collectionView?.scrollsToTop = false
) ).
来自苹果 scrollViewShouldScrollToTop(_:)
If the delegate doesn’t implement this method, true is assumed. For the scroll-to-top gesture (a tap on the status bar) to be effective, the scrollsToTop property of the UIScrollView must be set to YES.
- 如果您的层次结构是高度自定义的,方法
scrollViewShouldScrollToTop
将不会被调用。你应该检查为什么会发生。否则你将不得不做一些肮脏的工作:添加一些手势并处理它们。
有趣的链接:
Scroll to top of UITableView by tapping status bar
Why doesn't UIScrollView/UITableview respond to taps on the status bar, and scroll to the top?
好的,我找到了 table 视图无法滚动的原因!
我只在 table 视图的视图控制器的 viewDidLoad 中调用了我的 checkForScrollViewInView() 函数。为了禁用每个子视图的 scrollToTop。
但我忘了我还有另一个 "active" 视图控制器...在我的应用程序中,我有一个左侧菜单,可以打开滑动。在左侧菜单的视图控制器中调用 checkForScrollViewInView() 解决了我的问题。
func checkForScrollViewInView(view:UIView) {
for subview in view.subviews as [UIView] {
if subview.isKindOfClass(UITextView) {
(subview as! UITextView).scrollsToTop = false
}
if subview.isKindOfClass(UIScrollView) {
(subview as! UIScrollView).scrollsToTop = false
}
if subview.isKindOfClass(UITableView) {
(subview as! UITableView).scrollsToTop = false
}
if (subview.subviews.count > 0) {
self.checkForScrollViewInView(subview)
}
}
}
我有很多视图,每个视图都有很多子视图。 我试图为每个子视图指定
scrollsToTop = false
但是我的 TableView
在我按下状态栏时没有滚动到顶部。
我想我错过了一些观点...
我知道有一个类似的 post 但它没有回答 (UITableView scroll to top when tapping status bar at top of the screen)
所以我决定实现这个功能:
override func viewDidLoad() {
super.viewDidLoad()
checkForScrollViewInView(self.view)
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.scrollsToTop = true
}
func checkForScrollViewInView(view:UIView) {
for subview in view.subviews as [UIView] {
if subview.isKindOfClass(UITextView) {
(subview as! UITextView).scrollsToTop = false
}
if subview.isKindOfClass(UIScrollView) {
(subview as! UIScrollView).scrollsToTop = false
}
if subview.isKindOfClass(UITableView) {
(subview as! UITableView).scrollsToTop = false
}
if (subview.subviews.count > 0) {
self.checkForScrollViewInView(subview)
}
}
}
但是也行不通。我不知道我想念什么。
您可能会遇到两个问题:
- 您有多个
UIScrollView
实例。您应该为父UIScrollView
或从它继承的对象(如UITableView
或UICollectionView
禁用scrollsToTop
(例如viewDidLoad
中的self.collectionView?.scrollsToTop = false
) ).
来自苹果 scrollViewShouldScrollToTop(_:)
If the delegate doesn’t implement this method, true is assumed. For the scroll-to-top gesture (a tap on the status bar) to be effective, the scrollsToTop property of the UIScrollView must be set to YES.
- 如果您的层次结构是高度自定义的,方法
scrollViewShouldScrollToTop
将不会被调用。你应该检查为什么会发生。否则你将不得不做一些肮脏的工作:添加一些手势并处理它们。
有趣的链接:
Scroll to top of UITableView by tapping status bar
Why doesn't UIScrollView/UITableview respond to taps on the status bar, and scroll to the top?
好的,我找到了 table 视图无法滚动的原因!
我只在 table 视图的视图控制器的 viewDidLoad 中调用了我的 checkForScrollViewInView() 函数。为了禁用每个子视图的 scrollToTop。
但我忘了我还有另一个 "active" 视图控制器...在我的应用程序中,我有一个左侧菜单,可以打开滑动。在左侧菜单的视图控制器中调用 checkForScrollViewInView() 解决了我的问题。
func checkForScrollViewInView(view:UIView) {
for subview in view.subviews as [UIView] {
if subview.isKindOfClass(UITextView) {
(subview as! UITextView).scrollsToTop = false
}
if subview.isKindOfClass(UIScrollView) {
(subview as! UIScrollView).scrollsToTop = false
}
if subview.isKindOfClass(UITableView) {
(subview as! UITableView).scrollsToTop = false
}
if (subview.subviews.count > 0) {
self.checkForScrollViewInView(subview)
}
}
}