3

私はscrollViewを取得し、UIViewアニメーション中に次のcontentOffsetようcontentInsetにしたい:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(100, 100, 120, 100)];
    scrollView.backgroundColor = [UIColor grayColor];
    scrollView.contentSize = scrollView.frame.size;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 120, 30)];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = @"hello world";

    [scrollView addSubview:label];

    UIViewController *vc = [[UIViewController alloc] init];
    [vc.view addSubview:scrollView];

    [scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL];
    [scrollView addObserver:self forKeyPath:@"contentInset" options:NSKeyValueObservingOptionNew context:NULL];

    [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
        scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
        scrollView.contentOffset = CGPointMake(0, -50);
    } completion:nil];

    self.window.rootViewController = vc;

    return YES;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"contentOffset"]) {
        NSLog(@"offset:%@", [change valueForKey:NSKeyValueChangeNewKey]);
    }
    if ([keyPath isEqualToString:@"contentInset"]) {
        NSLog(@"inset:%@", [change valueForKey:NSKeyValueChangeNewKey]);
    }
}

残念ながら、アニメーション中に出力がありません。UIView アニメーションを実行しているときに何かが足りないのでしょうか、それとも KVO が機能しませんか?

4

1 に答える 1

4

UIViewアニメーション中に KVO が機能しないという結論は正しいです。

これは、スクロール ビューの実際のプロパティがアニメーションの過程で変化しないためです。コア アニメーションは、開始状態から終了状態に移動するスクロール ビューを表すビットマップを単純にアニメーション化します。基礎となるオブジェクトのプロパティをそのまま更新するわけではないため、アニメーションの実行中に KVO の状態が変化することはありません。

UIScrollViewDelegate同じ理由で、プロトコル メソッドを介して contentOffset と inset を観察しようとすると、残念ながら同じことが当てはまります。

より詳細な (そしてかなり不可解な) 説明については、Apple のガイド (こちら) を参照してください。

于 2013-08-11T18:08:40.753 に答える