ОК. Я протестировал его в симуляторе в iOS 4 и iOS 5. Как только я установил вставки, делегат вызывается в обеих версиях ОС.
Документация делегата говорит нам:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
// Tells the delegate when the user scrolls the content view within the receiver.
// The delegate typically implements this method to obtain the change in
// content offset from scrollView and draw the affected portion of the content view.
Сначала он говорит , когда пользователь прокручивает , что не так. Но в деталях написано изменение смещения контента , которое происходит, когда вы устанавливаете вставку. Поскольку содержимое не будет меняться в положении, когда вы устанавливаете contentinset, поэтому оно корректирует смещение соответственно.
Так что это не ошибка. Но делегат должен быть вызван. В моем тесте - это было.
ОК, мой полный тест: единственное различие между 4.0 и 5.0, которое я вижу, заключается в том, что ScrollView - это _UIWebViewScrollView
в 5.0. Также webview-scrollview ведет себя иначе, чем стандартный-scrollview. В стандартном scrollView делегат вызывается, в webviewScrollView он не вызывается.
Полный код теста:
- (void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear: animated];
NSLog(@"System: %@, iOS %@",
[UIDevice currentDevice].systemName,
[UIDevice currentDevice].systemVersion);
UIWebView* webView = [[UIWebView alloc] initWithFrame: CGRectMake(20, 20, 200, 200)];
[self.view addSubview: webView];
UIScrollView* scrollView = [self getScrollViewFromWebView: webView];
scrollView.delegate = self;
NSLog(@"%@", scrollView);
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
NSLog(@"inset: %.1f", scrollView.contentInset.top);
[scrollView setContentInset: UIEdgeInsetsMake(44, 0, 0, 0)];
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
NSLog(@"inset: %.1f", scrollView.contentInset.top);
[scrollView setContentOffset: CGPointMake(20, 20) animated: NO];
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(20, 240, 200, 200)];
[self.view addSubview: scrollView];
scrollView.delegate = self;
NSLog(@"%@", scrollView);
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
NSLog(@"inset: %.1f", scrollView.contentInset.top);
[scrollView setContentInset: UIEdgeInsetsMake(44, 0, 0, 0)];
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
NSLog(@"inset: %.1f", scrollView.contentInset.top);
[scrollView setContentOffset: CGPointMake(20, 20) animated: NO];
NSLog(@"offset: %.1f", scrollView.contentOffset.y);
}
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidScroll");
}
- (UIScrollView *)getScrollViewFromWebView: (UIWebView*) webView {
UIScrollView *scrollView = nil;
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:@"5.0" options:NSNumericSearch] != NSOrderedAscending) {
return webView.scrollView;
}
else {
for (UIView *subview in [webView subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
scrollView = (UIScrollView *)subview;
}
}
if (scrollView == nil) {
NSLog(@"Couldn’t get default scrollview!");
}
}
return scrollView;
}
Результирующий журнал для iOS 4.0 :
2012-03-14 18:57:17.943 Test[9009:40b] System: iPhone OS, iOS 4.0.2
2012-03-14 18:57:17.970 Test[9009:40b] <UIScrollView: 0x5e12610; frame = (0 0; 200 200); clipsToBounds = YES; autoresize = H; layer = <CALayer: 0x5e127f0>; contentOffset: {0, 0}>
2012-03-14 18:57:17.971 Test[9009:40b] offset: 0.0
2012-03-14 18:57:17.971 Test[9009:40b] inset: 0.0
2012-03-14 18:57:17.972 Test[9009:40b] offset: 0.0
2012-03-14 18:57:17.972 Test[9009:40b] inset: 44.0
2012-03-14 18:57:17.972 Test[9009:40b] scrollViewDidScroll
2012-03-14 18:57:17.973 Test[9009:40b] offset: 20.0
2012-03-14 18:57:17.973 Test[9009:40b] <UIScrollView: 0x5e14c50; frame = (20 240; 200 200); clipsToBounds = YES; layer = <CALayer: 0x5e14240>; contentOffset: {0, 0}>
2012-03-14 18:57:17.974 Test[9009:40b] offset: 0.0
2012-03-14 18:57:17.974 Test[9009:40b] inset: 0.0
2012-03-14 18:57:17.974 Test[9009:40b] scrollViewDidScroll
2012-03-14 18:57:17.975 Test[9009:40b] offset: -44.0
2012-03-14 18:57:17.975 Test[9009:40b] inset: 44.0
2012-03-14 18:57:17.976 Test[9009:40b] scrollViewDidScroll
2012-03-14 18:57:17.976 Test[9009:40b] offset: 20.0
2012-03-14 18:57:18.468 Test[9009:40b] scrollViewDidScroll
2012-03-14 18:57:19.033 Test[9009:40b] scrollViewDidScroll
Журнал результатов для iOS 5.0 :
2012-03-14 18:59:08.210 Test[9071:40b] System: iPhone OS, iOS 5.0
2012-03-14 18:59:08.227 Test[9071:40b] <_UIWebViewScrollView: 0x6829020; frame = (0 0; 200 200); clipsToBounds = YES; autoresize = H; layer = <CALayer: 0x6829230>; contentOffset: {0, 0}>
2012-03-14 18:59:08.227 Test[9071:40b] offset: 0.0
2012-03-14 18:59:08.228 Test[9071:40b] inset: 0.0
2012-03-14 18:59:08.228 Test[9071:40b] offset: 0.0
2012-03-14 18:59:08.229 Test[9071:40b] inset: 44.0
2012-03-14 18:59:08.229 Test[9071:40b] scrollViewDidScroll
2012-03-14 18:59:08.230 Test[9071:40b] offset: 20.0
2012-03-14 18:59:08.230 Test[9071:40b] <UIScrollView: 0xca217a0; frame = (20 240; 200 200); clipsToBounds = YES; layer = <CALayer: 0xca0c880>; contentOffset: {0, 0}>
2012-03-14 18:59:08.231 Test[9071:40b] offset: 0.0
2012-03-14 18:59:08.231 Test[9071:40b] inset: 0.0
2012-03-14 18:59:08.232 Test[9071:40b] scrollViewDidScroll
2012-03-14 18:59:08.232 Test[9071:40b] offset: -44.0
2012-03-14 18:59:08.232 Test[9071:40b] inset: 44.0
2012-03-14 18:59:08.233 Test[9071:40b] scrollViewDidScroll
2012-03-14 18:59:08.233 Test[9071:40b] offset: 20.0