2010-11-12 165 views
19

中不起作用,通常在点击屏幕顶部时,tableview会一直滚动到顶部。出于某种原因,这在我的一个视图控制器中不起作用。自动滚动到顶部在UITableView

的hirarchy如下:

的UIView
- > web视图
- >的TableView
----->搜索栏
SearchDisplayController。

我想我已经正确地连接了一切(数据源,委托,...)。我有一个类似的视图控制器,一切正常。唯一的区别似乎是WebView,在视图控制器中缺少点击和滚动到顶部的作品...

任何想法?

最好的问候, 萨沙

回答

27

您需要在其它所有滚动视图之一禁用scrollsToTop。由于UITableViewUIScrollView的后裔,因此很容易做到。不过,如果你想在web视图上禁用它,这有点棘手。这似乎工作:

[webView.subviews objectAtIndex:0].scrollsToTop = NO; 

但这是有点iffy,因为它是在webview的无证部分戳。如果苹果决定重新安排子视图,它可能会停止工作。

+1

我不能简单地枚举所有子视图,检查哪一个是scrollview的子类,并在所有适当的子视图上使用上面的代码? – Sascha 2010-11-14 06:25:10

+1

这里是我做什么(其甚至应该继续即使苹果决定重新排列子视图):\t对(INT I = 0; I <[webView.subviews计数];我++) \t { \t \t ID子视图= [webView.subviews objectAtIndex:i]; \t \t如果([子视图isKindOfClass:[UIScrollView的类]]) \t \t { \t \t \t((的UIScrollView *)子视图).scrollsToTop = NO; \t \t} \t} – Sascha 2010-11-14 14:28:26

+7

作为iOS 5的的,的UIWebView的-scrollView属性[露出](http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference。 HTML#// apple_ref/OCC/instp/UIWebView中/滚动视图)。 – 2012-10-22 16:48:32

3

很显然,如果你有一个视图控制器不止一个滚动视图(你的情况的WebView和TableView中)时,“水龙头状态栏滚动到顶部”被禁用。

http://twitter.com/drance/status/2448035250438144

(马特Drance是前者的iPhoneOS开发人员传播者,目前的iOS开发的Rockstar)

0

我只是在NIB的tableview有这个问题。非常令人沮丧,直到我记得我以编程方式将UITextView添加为表视图标题。 scrollsToTop = NO在UITextView上做了诡计。

30

您可能在视图层次结构中添加了一些视图,这些视图是UIScrollView或包含滚动视图(例如UIWebViewUITextView)。当您点击状态栏时,iOS搜索最上面的滚动视图,scrollsToTop设置为YES并滚动到顶部。

添加到您的类:

- (void) disableScrollsToTopPropertyOnAllSubviewsOf:(UIView *)view { 
    for (UIView *subview in view.subviews) { 
     if ([subview isKindOfClass:[UIScrollView class]]) { 
      ((UIScrollView *)subview).scrollsToTop = NO; 
     } 
     [self disableScrollsToTopPropertyOnAllSubviewsOf:subview]; 
    } 
} 

...并呼吁

[self disableScrollsToTopPropertyOnAllSubviewsOf:myAddedSubview]; 

来解决这个问题,让你的表视图滚动再次顶部。

+1

非常感谢!我无法找到问题,为什么我的tableview不滚动,因为我只有两个tableViews,只有一个启用scrollToTop。使用这个函数,我发现有一个第三个滚动视图,我将其添加为一个子视图。我完全忘了那个! :) 谢谢!!!! – 2012-06-21 12:52:13

+1

没有想到UITextView计数。谢谢。 – 2013-03-25 00:04:45

+0

这对于查找有问题的子视图非常有用,谢谢! – ebi 2013-10-16 19:44:29

0

在视图的所有滚动视图中设置scrollsToTop = NO,除了要滚动到顶部的滚动视图之外。这有助于系统找到正确的滚动视图。

1

我只是想补充这一点,如果你使用的是UITextView,它不是需要scrollsToTop调整子视图,它的实际UITextView,总之你需要这个代码:

[myTextView setScrollsToTop:FALSE]; 

这应该解决问题(另外,'disableScrollsToTopPropertyOnAllSubviewsOf'功能在UITextViews上不起作用)。

希望这可以帮助别人!

4

不知道苹果在吸烟,但从设计上看,iPhone上的行为与iPad明显不同。 Apple's documentation不包括“特殊Condsideration”注意如下...

在iPhone上,滚动到顶部的姿态没有效果,如果有更多的 比一个滚动屏幕上查看有scrollsToTop设为是。

所以在iPhone上,你必须确保有永远只能一个的UIScrollView(或的UITableView/UICollectionView/UIWebView的等),有它scrollsToTop = YES

由于scrollsToTop默认为YES,因此您必须为UIScrollView的显式设置scrollsToTop = NO,您不想在用户点击状态栏时进行滚动。

3

opyh的答案的迅捷变体。 Upvote他!

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) { 
    for subview in view.subviews { 
     if let scrollView = subview as? UIScrollView { 
      (scrollView as UIScrollView).scrollsToTop = false 
     } 
     self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView) 
    } 
} 
相关问题