上/下でフェードアウトする 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を呼び出すべきではなく、すぐに新しいフレームを設定します...