使用这个类别:
UIView+LogViewHierarchy.h
#import <UIKit/UIKit.h>
@interface UIView (LogViewHierarchy)
-(void) logViewHierarchy;
@end
UIView+LogViewHierarchy.m
#import "UIView+LogViewHierarchy.h"
@implementation UIView (LogViewHierarchy)
-(void) logViewHierarchy
{
NSLog(@"%@%@", NSStringFromClass(self.class), NSStringFromCGRect(self.frame));
[self logSubviews:self depth:1];
}
-(void) logSubviews:(UIView*)view depth:(NSInteger)depth
{
for (UIView *subview in view.subviews) {
if ([subview isKindOfClass:[UIScrollView class]]) {
NSLog(@"%@%@%@ - scrollsToTop: %@", [self paddingString:depth], NSStringFromClass(subview.class), NSStringFromCGRect(subview.frame), ((UIScrollView*)subview).scrollsToTop ? @"YES" : @"NO");
} else {
NSLog(@"%@%@%@", [self paddingString:depth], NSStringFromClass(subview.class), NSStringFromCGRect(subview.frame));
}
[self logSubviews:subview depth:depth+1];
}
}
-(NSString*) paddingString:(NSInteger)depth
{
return [@"" stringByPaddingToLength:depth*2 withString:@" " startingAtIndex:0];
}
@end
然后找到你应用的根视图控制器并添加:
-(void) viewDidAppear:(BOOL)animated
{
[self.view logViewHierarchy];
}
您将能够看到所有 UIScrollView 及其 scrollsToTop 属性。当您设法使您的输出看起来只有 1 个具有 scrollsToTop == YES 的 UIScrollView 时,您的 scrollsToTop 手势应该可以正常工作。
在我的例子中,logViewHierarchy 报告说你所有的滚动视图都有scrollsToTop = NO,你不知道为什么,因为我明确地将它们设置为YES。
原来我在我的项目中留下了this UIScrollView category,它在我所有的 UIScrollViews 上重载了一些方法。当我从我的项目中删除该类别时,我能够从logViewHierarchy 获得正确的输出。然后我玩弄代码,直到我只得到一个scrollsToTop = YES。