13

注: 以下の UPDATE 回答に新しいソリューションを追加しました。

iPhone/iPod touch の Mobile Safari のタブで見た効果を再現してみました。

基本的に、これは 4 つの再利用可能な UIView (リング バッファーのように機能する) を保持し、水平方向にスクロールする UIScrollView です。スクロールすると、UIView の不透明度がオフセットでシームレスにフェードイン/フェードアウトします。

現在、私は ですべての汚い仕事をしてい- (void)scrollViewDidScroll:(UIScrollView *)scrollViewます。UIScrollView から contentOffset を取得する、ページングを決定する、contentOffset と各 UIView の位置の間のデルタを計算する、呼び出された瞬間の各 UIView のアルファ値を決定/設定するなどscrollViewDidScroll:

そしてそれは機能し、パフォーマンスは問題なく、すべてがスムーズに実行されますが、唯一の問題は計算が多すぎることです.

UIView のbeginAnimations:とを試しcommitAnimations:ましたが、 でscrollViewDidScroll:は役に立ちません。1) 新しいアルファ値はまだ自分で計算する必要があり、2) scrollViewDidScroll: スクロール時に呼び出され続けているため、ここでアニメーションを実行しても意味がありません。この部分をCore Animationで書き直す方法はありますか?そのため、各 UIView のアルファ値を自分で計算する必要はありません。代わりに、作品全体を Core Animation に任せることができます。

4

2 に答える 2

26

アップデート

各ページのアルファ値を更新する別の方法を思いつきました。コンテンツ ビューを作成するときは、KVO を使用して、UIScrollView の contentOffset で Observer を追加します。

[self.scrollView addObserver:[self.contentViews objectAtIndex:i] 
                  forKeyPath:@"contentOffset" 
                     options:NSKeyValueObservingOptionNew
                     context:@selector(updateAlpha:)];

contentOffset が変更されたときに、各 contentViews がメッセージを受け取るようにします。

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
    [self performSelector:(SEL)context withObject:change];
}

そして、私の contentViews は、スクロール時に計算を行い、アニメーション化することができます:

- (void)updateAlpha:(NSDictionary *)change {
    CGFloat offset = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue].x;
    CGFloat origin = [self frame].origin.x;
    CGFloat delta = fabs(origin - offset);

    [UIView beginAnimations:@"Fading" context:nil];
    if (delta < [self frame].size.width) {
        self.alpha = 1 - delta/self.frame.size.width*0.7;
    } else {
        self.alpha = 0.3;
    }
    [UIView commitAnimations];
}

もちろん、スーパービューからコンテンツ ビューを削除するときはオブザーバーを削除し、新しいコンテンツ ビューを作成するときにオブザーバーを再度追加する必要があります。

同じことをしたい人の助けになれば幸いです。

于 2009-05-24T14:36:50.693 に答える