11

2 つの UIColors がある場合、任意のサイズの領域でそれらの間に均一なグラデーションを描画する最良の方法は何ですか?

UIView サブクラスを作成し、drawRect メソッドで CG 描画メソッドを使用すると思います。どれがどれか、またはパフォーマンスなどの注意すべき落とし穴があるかどうかはわかりません。誰かがこれをしましたか?

4

7 に答える 7

50
#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 ライブラリを追加することを忘れないでください。

于 2013-03-08T19:56:35.073 に答える
20

CGGradient を使用する必要があります。iPhone Dev Center の「CGGradient Reference」ドキュメントを参照してください。

于 2008-10-22T18:41:36.997 に答える
0

CAGradientLayer を使用すると、ステッピングが目立つグラデーションが生成されることがわかりました。これを使用することになりました

http://evilrockhopper.com/tag/cggradient/

この質問のように UIView のグラデーションと iPhone の UILabels

于 2013-03-21T08:57:59.303 に答える
0

@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 を使用していない場合は、他の初期化子を使用してください。

于 2014-12-01T20:36:59.020 に答える
0

こんにちは、次を使用してビューにグラデーションを適用できます

-(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];
}
于 2015-10-06T08:51:42.127 に答える