1

スクロールするコンテンツがあることを示すために、スクロール ビューの両側に 1 つずつ、2 つのグラデーション レイヤーを作成しようとしています。

左側のものは正常に機能しますが、右側のものは完全に透明です。私は何が欠けていますか?

シブ

明らかな

CAGradientLayer *l = [CAGradientLayer layer];
l.frame = self.leftBlur.frame;
l.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
l.startPoint = CGPointMake(0.0f, 0.5f);
l.endPoint = CGPointMake(1.0f, 0.5f);
self.leftBlur.layer.mask = l;

self.leftBlur.hidden = YES;

CAGradientLayer *r = [CAGradientLayer layer];
r.frame = self.rightBlur.frame;
r.colors = [NSArray arrayWithObjects:(id)[UIColor clearColor].CGColor, (id)[UIColor whiteColor].CGColor, nil];
r.startPoint = CGPointMake(0.0f, 0.5f);
r.endPoint = CGPointMake(1.0f, 0.5f);
self.rightBlur.layer.mask = r;

デバッグ出力:

(lldb) po r
<CAGradientLayer:0x170ba6d0; position = CGPoint (305 62.5); bounds = CGRect (0 0; 30 125); allowsGroupOpacity = YES; endPoint = CGPoint (1 0.5); startPoint = CGPoint (0 0.5); colors = (
    "<CGColor 0x15e590e0> [<CGColorSpace 0x15e34b50> (kCGColorSpaceDeviceGray)] ( 1 1 )",
    "<CGColor 0x17012ed0> [<CGColorSpace 0x15d15310> (kCGColorSpaceDeviceRGB)] ( 1 0 0 1 )"
)>
(lldb) po self.rightBlur
<UIImageView: 0x171377d0; frame = (290 0; 30 125); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x17137860>>
(lldb) po l
<CAGradientLayer:0x170b9f00; position = CGPoint (15 62.5); bounds = CGRect (0 0; 30 125); allowsGroupOpacity = YES; endPoint = CGPoint (1 0.5); startPoint = CGPoint (0 0.5); colors = (
    "<CGColor 0x15e590e0> [<CGColorSpace 0x15e34b50> (kCGColorSpaceDeviceGray)] ( 1 1 )",
    "<CGColor 0x15d39320> [<CGColorSpace 0x15e34b50> (kCGColorSpaceDeviceGray)] ( 0 0 )"
)>
(lldb) po self.leftBlur
<UIImageView: 0x17136fc0; frame = (0 0; 30 125); hidden = YES; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x17137050>>
4

3 に答える 3

5

この問題は、異なる色空間からの色が原因である可能性が最も高いです。po rすると、色が同じ色空間にないことに注意してください。1 つは RGB からのもので、もう 1 つはグレーからのものです。

を使用する代わりに、 を使用することをお勧めし[UIColor clearColor]ます[UIColor colorWithWhite:1.0 alpha:0.0]。他の色と一緒に使用すると[UIColor whiteColor]、両方の色が同じ色空間になります。

編集:実際の問題は、おそらくframe「diederik」によって指摘された問題です。

于 2013-09-29T05:13:09.660 に答える
2

グラデーション レイヤーのフレームを のフレームと等しくなるように設定しますrightBlur。これにより、 内のレイヤーがオフセットされますrightBlur。境界に設定する必要があります。

r.frame = self.rightBlur.bounds;

左側の場合、原点が (0,0) であるため、これは機能しました。

于 2013-09-29T05:13:01.003 に答える