4

iPhone用のCALayer描画で奇妙な問題が発生しています。私は "気泡"を表すサブレイヤをたくさん追加するルートレイヤを持っています。最終結果は、次のようなものに見えることになっている:CALayerとCGGradientRefアンチエイリアス?

http://www.expensivedna.com/IMG_0018.PNG http://www.expensivedna.com/IMG_0018.PNG

問題を、私は、アンチエイリアス(泡のジャギーを気づか)に層を得るように見えることができないということです。次のようにバブルのCALayerのためdrawInContextを上書き私のコードは次のようになります。今

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.5, // Start color 
          1.0, 1.0, 1.0, 0.0 }; // End color 
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef glossGradient = 
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGPoint topCenter = CGPointMake(25, 20); 
CGPoint midCenter = CGPointMake(25, 25); 
CGContextDrawRadialGradient(theContext, glossGradient, midCenter, 20, topCenter, 10, kCGGradientDrawsAfterEndLocation); 

}

本当に奇妙なこと、私は少しに描画コードを変更した場合、次のようにのみ、通常の赤い丸を描くことである:

http://www.expensivedna.com/IMG_0017.PNG http://www.expensivedna.com/IMG_0017.PNG

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

CGContextSetFillColorWithColor(theContext, [UIColor redColor].CGColor); 
CGContextFillEllipseInRect(theContext, CGRectMake(0, 0, 40,40)); 
} 

すべてがアンチエイリアスOKに思えます

私はこの一見奇妙な行動を把握できないようです。アンチエイリアス勾配とノーマルサークルとの違いがありませんか?

ありがとうございます。

答えて

4

ありがとうございます。答えはあなたの2つの答え(コブとアレックス)の組み合わせであることが判明しました。基本的には、CGDrawRadialGradient関数は開始サークルでエイリアシングしか持たないように見えます。私はエイリアス「エッジ」の両方にしたいので、私が最初に続く最初の「エッジ」の世話をするうち、内側から引き出すための機能を設定しますが、生成:

その後Step 1

、私はクリップcoobによって提案され、それがバブルの最後のエッジの周りに素敵なエイリアシングを与えるイメージとして:

Step 2

は私のために十分に良いですね!

- (void)drawInContext:(CGContextRef)theContext{ 
CGContextSetAllowsAntialiasing(theContext, true); 
CGContextSetShouldAntialias(theContext, true); 

size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.0, // Start color 
       1.0, 1.0, 1.0, 0.5 }; // End color 
CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef glossGradient = 
CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGContextAddEllipseInRect(theContext, CGRectMake(5, 5, 40, 40)); 
CGContextClip(theContext); 

CGPoint topCenter = CGPointMake(25, 20); 
CGPoint midCenter = CGPointMake(25, 25); 
CGContextDrawRadialGradient(theContext, glossGradient, topCenter, 10, midCenter, 20, kCGGradientDrawsAfterEndLocation); 

}

0

多分、kCGGradientDrawsAfterEndLocationを削除しようとしますか?アルファベットで奇妙なことをしているかもしれません

2

Jeff - topCenterを少し外にして、円形マスク付きのCGContextClipToMaskを使用してください。

編集:これを行うもっと良い方法は、CGContextClipを使用してベクタークリッピングパスを使用することです。

編集2:サンプルコード:

CGContextAddEllipseInRect(theContext, CGRectMake(20, 20, 10, 10)); 
CGContextClip(theContext); 

あなたのグラデーションを描画する前にこれを追加し、アウトビットさらにそれを描きます。

+0

先端:完全にここにジャギーを除去するために1ポイント私の四角形をインセットしなければなりませんでした。 – mattorb