前言
scrollToTop属性提供了点击iPhone状态栏页面回到顶部的功能,极大的方便了开发者的工作量。但是在使用的过程中,因为页面的复杂,经常会造成scrollToTop不生效的问题。
下文中提到的UIScrollView是指继承自或者包含了UIScrollView的View,如UITextView,UICollectionView, UITableView,UIWebView等
首先,在确保scrollToTop = YES或者是scrollViewShouldScrollToTop:代理方法返回的是YES的情况下,如果scrollToTop无效,那么就要检查下当前view上是不是有多个UIScrollView了。
接下来是逐步排查这个问题的步骤:
- 尝试直接查找页面上的其它UIScrollView,设置scrollToTop = NO;
- 如果第一步已经做过,scrollToTop仍然无效,那么就使用分类方法打印出当前页面上的所有scrollToTop = YES的view,并把隐藏的这些UIScrollView的scrollToTop设置为NO
@interface UIView (UIScrollViewDetect)
- (void)detectScrollsToTopViews;
@end
@implementation UIView (UIScrollViewDetect)
- (void)detectScrollsToTopViews {
for (UIView *view in self.subviews) {
if ([view isKindOfClass:UIScrollView.class]) {
UIScrollView *scrollView = (UIScrollView *)view;
if (scrollView.scrollsToTop) {
NSLog(@"%@", scrollView);
}
}
[view detectScrollsToTopViews];
}
}
@end
- 如果找到了影响的UIScrollView,但是view是第三方库里的,无法修改其scrollToTop的属性,那么可以使用extension在当前类中把私有的UIScrollView的属性暴露出来,再设置其scrollToTop属性,操作方法参考另外一篇文章:
OC中使用类别Extension调用私有方法
作者语:
开发中遇到的大部分问题都有迹可循,碰到问题不要急躁,认真分析,逐步突破,最终一定能解决。