web-dev-qa-db-ja.com

CGContextの透明な背景の設定

私はまだCGContextで線を引くのに苦労しています。実際に線を引いて描画しましたが、現在は、Rectの背景を透明にして、既存の背景が透けて見えるようにする必要があります。これが私のテストコードです。

(void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
    CGContextSetAlpha(context,0.0);
    CGContextFillRect(context, rect);

    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

何か案は?

50
Jim B

UIGraphicsGetCurrentContext()呼び出し後CGContextClearRect(context,rect)を呼び出します

編集:わかった、わかった。

行を含むカスタムビューには次のものが必要です。

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setBackgroundColor:[UIColor clearColor]];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

私のテストでは、これを非常に基本的なUIViewControllerとして使用しました。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *v = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [v setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:v];
    TopView *t = [[TopView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:t];
    [v release];
    [t release];
}
70
David Kanarek

簡単な方法:

- (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame]))
    {       
        self.opaque = NO;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    //your code
}
41
ZGl6YXNt

opaque == false、Swift 3でコンテキストを初期化する

UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 

不透明

ビットマップが不透明かどうかを示すブールフラグ。ビットマップが完全に不透明であることがわかっている場合は、アルファチャネルを無視してビットマップのストレージを最適化するにはtrueを指定します。 falseを指定すると、部分的に透明なピクセルを処理するために、ビットマップにアルファチャネルを含める必要があります。

4
onmyway133

これは、InterfaceBuilderを使用して手動で追加されたUIImageで機能しました。

- (id)initWithCoder:(NSCoder *)aDecoder {

    if(self = [super initWithCoder:aDecoder]) {
        self.backgroundColor = [UIColor clearColor];
    }

    return self;
}


-(void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();    
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 100.0,0.0);
    CGContextAddLineToPoint(context,100.0, 100.0);
    CGContextStrokePath(context);
}

David Kanarekの答えは、独自のUIImageViewを手動で作成している場合にのみ機能します。 UIViewを作成し、Interface Builderを使用して手動で追加した場合、代わりにinitWithCoderメソッドを呼び出すこのような別のアプローチが必要になります。

4
Patrick Collins

私は同じ問題を抱えていて、それがわかった。 initメソッドを上書きします-(id)initWithFrame:(CGRect)rect.このメソッドではself.background = [UIColor clearColor];しかし、私はこのビューをxibファイルで使用します!!!それはinitメソッドを呼び出します

-(id)initWithCoder:(NSCoder*)aDecoder;

したがって、すべてのinitメソッドを上書きし、BackgroundColorをセットアップすると正常に機能します。

3
en-菜鸟..
CGContextClearRect(context,rect) 

指定されたコンテキストがウィンドウまたはビットマップコンテキストの場合、Quartzは効果的に四角形をクリアします。他のコンテキストタイプの場合、Quartzはデバイス依存の方法で四角形を塗りつぶします。ただし、ウィンドウまたはビットマップコンテキスト以外のコンテキストでは、この関数を使用しないでください。

2
Codrut

次のコードで画像コンテキストを作成できます。

cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0);
CGContextFillRect(cacheContext, (CGRect){CGPointZero, size});

キーはkCGImageAlphaPremultipliedLastです。

1
fluke

ここで質問を理解するのに苦労していますが、描画している「トップ」ビューを通して「バックグラウンド」UIViewを表示できない場合、1つの解決策はtopView.backgroundColor = [UIColor clearColor];私は同じ問題を抱えていたと思いますが、これで解決しました。

0
oflannabhra