UIWebView scrollView в iOS 4 не вызывает contentOffset - PullRequest
1 голос
/ 13 марта 2012

У меня был следующий код, который устанавливает contentInset для scrollView UIWebView

webScrollView.contentInset = UIEdgeInsetsMake(44, 0.0, 0.0, 0.0);

, и вот как я получаю scrollView UIWebView:

 - (UIScrollView *)defaultScrollView {
        UIScrollView *scrollView = nil;

        NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
        if ([currSysVer compare:@"5.0" options:NSNumericSearch] != NSOrderedAscending) {
            return self.scrollView;
        }
        else {
            for (UIView *subview in [self subviews]) {
                if ([subview isKindOfClass:[UIScrollView class]]) {
                    scrollView = (UIScrollView *)subview;
                }
            }

            if (scrollView == nil) {
                NSLog(@"Couldn’t get default scrollview!");
            }
        }
        return scrollView;
    }

В iOS 5 вызов выше также устанавливаетcontentOffset, я знаю это, потому что он вызывает делегат scrollViewDidScroll, однако в iOS 4 нет ... никакой идеи, почему это так и как это исправить?

1 Ответ

2 голосов
/ 14 марта 2012

ОК. Я протестировал его в симуляторе в 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
...