1

3色のCGGradientをどのように描くのですか?

私はそのような配列を持っています:

CFArrayRef colors = (__bridge CFArrayRef) [NSArray arrayWithObjects:(id)lightGradientColor.CGColor,
                                           (id)darkGradientColor.CGColor, (id)lightGradientColor.CGColor,
                                           nil];

しかし、私は真ん中に暗い色が見えず、上部と下部に明るい色がありますが、上部が明るいだけで、下部まで暗い色が見えます。

4

2 に答える 2

3

色の位置を指定/確認してみましたか?範囲は[0...1]です:

const CGFloat locations[3] = {0.0, 0.5, 1.0};
CGGradientRef grad = CGGradientCreateWithColors(colorspace, colors, locations);

注:上記の場所0は、locationsパラメーターを渡すのと同じである必要があります。

于 2012-07-30T08:18:30.630 に答える
0

よりスムーズな結果を得るために、CAGardientLayerの代わりにCGGradientを使用して複数の色を渡します。

A.ヘッダーに@propertyNSArray*の色を使用してカスタムUIViewクラスを作成します。実装ファイルに、次のdrawRectメソッドを貼り付けます。

-(void)drawRect:(CGRect)rect {

    //1. create vars
    float increment = 1.0f / (colours.count-1);
    CGFloat * locations = (CGFloat *)malloc((int)colours.count*sizeof(CGFloat));
    CFMutableArrayRef mref = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);

    //2. go through the colours, creating cgColors and locations
    for (int n = 0; n < colours.count; n++){
        CFArrayAppendValue(mref, (id)[colours[n] CGColor]);
        locations[n]=(n*increment);
    }

    //3. create gradient
    CGContextRef ref = UIGraphicsGetCurrentContext();
    CGColorSpaceRef spaceRef = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradientRef = CGGradientCreateWithColors(spaceRef, mref, locations);
    CGContextDrawLinearGradient(ref, gradientRef, CGPointMake(0.0, 0.0), CGPointMake(0.0, self.frame.size.height), kCGGradientDrawsAfterEndLocation);
    CGColorSpaceRelease(spaceRef);
    CGGradientRelease(gradientRef);
}

B.カスタムクラスを使用するviewControllerで、それを初期化し、フレームとその色を設定します。複数の色で機能し、この場合は上から下に実行されます。

Background * bg = [Background new];
[bg setFrame:self.view.bounds];
[bg setColours:@[[UIColor blueColor],[UIColor purpleColor]]];
[self.view addSubview:bg];

これは、CAGradientLayerを使用するよりも滑らかなグラデーションであり、色にアルファをドロップするとより目立ちます。

CGGradient CAGradientLayer

于 2016-11-28T14:04:35.600 に答える