2

上/下でフェードアウトする UIScrollView のサブクラスがあります。(Notes.app が DetailView の下部で行うように、opaque から clearColor まで。)

そこで、UIGradientLayer を scrollview.layer.mask として追加しました。これは、最初にスクロールするまで正常に動作しているように見えました。

    CAGradientLayer *mask = [CAGradientLayer layer];
    mask.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0],
                      [NSNumber numberWithFloat:0.1],
                      [NSNumber numberWithFloat:0.9],
                      [NSNumber numberWithFloat:1.0],
                      nil];

    mask.colors = [NSArray arrayWithObjects:
                   (__bridge id)[UIColor clearColor].CGColor,
                   (__bridge id)[UIColor whiteColor].CGColor,
                   (__bridge id)[UIColor whiteColor].CGColor,
                   (__bridge id)[UIColor clearColor].CGColor,
                   nil];

    mask.frame = self.scrollview.bounds;
    // vertical direction
    mask.startPoint = CGPointMake(0, 0); 
    mask.endPoint = CGPointMake(0, 1);

    self.scrollview.layer.mask = mask;

しかし、スクロールすると、マスクは画面の位置に固執するのではなく、コンテンツとともにスクロールして、コンテンツをうまくフェードアウトさせました。

スクロールビューのレイアウトサブビューでマスクを再配置することで、それを修正しました。

-(void)layoutSubviews {
    [super layoutSubviews];

    CGRect layerMaskFrame = self.layer.mask.frame;
    layerMaskFrame.origin = [self convertPoint:self.bounds.origin toView:self];

    self.layer.mask.frame = layerMaskFrame;
}

しかし、スクロールするとマスクの動きが少し遅くなります。マスクのフレームがディレイで設定されてアニメートされているように見えます。

スクロールもマスクの動きも滑らかではないので、ハードウェアが遅すぎても問題ないと思います。

しかし、それはどうしてですか?アニメーションからlayoutSubviewsを呼び出すべきではなく、すぐに新しいフレームを設定します...

4

1 に答える 1

6

この記事http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.htmlを参照すると、フレームの変更を次のように囲む必要があります。

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

// Set the frame

[CATransaction commit];

これにより、アニメーションなしで発生するはずです。これがうまくいくことを願っています:)

于 2012-04-19T17:11:41.203 に答える