2 つの UIColors がある場合、任意のサイズの領域でそれらの間に均一なグラデーションを描画する最良の方法は何ですか?
UIView サブクラスを作成し、drawRect メソッドで CG 描画メソッドを使用すると思います。どれがどれか、またはパフォーマンスなどの注意すべき落とし穴があるかどうかはわかりません。誰かがこれをしましたか?
2 つの UIColors がある場合、任意のサイズの領域でそれらの間に均一なグラデーションを描画する最良の方法は何ですか?
UIView サブクラスを作成し、drawRect メソッドで CG 描画メソッドを使用すると思います。どれがどれか、またはパフォーマンスなどの注意すべき落とし穴があるかどうかはわかりません。誰かがこれをしましたか?
#import <QuartzCore/QuartzCore.h>
- (void) setGradient {
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
[self.view.layer insertSublayer:gradient atIndex:0];
}
プロジェクトに QuartzCore ライブラリを追加することを忘れないでください。
CGGradient を使用する必要があります。iPhone Dev Center の「CGGradient Reference」ドキュメントを参照してください。
CAGradientLayer を使用すると、ステッピングが目立つグラデーションが生成されることがわかりました。これを使用することになりました
@Anton Chikin と同じようなソリューションですが、もう少し堅牢です。...のオーバーライドに注意してくださいlayerClass
。この方法では、フレームの設定について心配する必要がなく、フレームは回転およびサイズ変更時に自動的に更新されます。
class GradientView: UIView {
var colorA : UIColor = UIColor.greenColor() {
didSet { updateGradient() }
}
var colorB : UIColor = UIColor.blueColor() {
didSet { updateGradient() }
}
override class func layerClass() -> AnyClass {
return CAGradientLayer.self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateGradient()
}
func updateGradient() {
if let gLayer = layer as? CAGradientLayer {
gLayer.colors = [colorA.CGColor, colorB.CGColor]
}
}
}
IB を使用している場合は、「ユーザー定義のランタイム属性」を介してプロパティを設定できます。
IB を使用していない場合は、他の初期化子を使用してください。
こんにちは、次を使用してビューにグラデーションを適用できます
-(void)applyGradientEffecttoView:(UIView *)aView
{
// Create the colors
UIColor *darkOp = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0];
UIColor *lightOp =[UIColor colorWithRed:255.0f green:255.0f blue:255.0f alpha:0.0];
// Create the gradient
CAGradientLayer *gradient = [CAGradientLayer layer];
// Set colors
gradient.colors = [NSArray arrayWithObjects:
(id)lightOp.CGColor,
(id)darkOp.CGColor,
nil];
gradient.locations = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.0f],
[NSNumber numberWithFloat:0.5],
nil];
// Set bounds
gradient.frame = aView.bounds;
// Add the gradient to the view
[aView.layer insertSublayer:gradient atIndex:0];
}