在 iPhone 应用程序中手动绘制渐变?

11

如果我有两个UIColors,最佳的方法是如何在任意大小的区域中均匀绘制它们之间的渐变?

我猜你需要创建一个UIView子类,并在drawRect方法中使用CG绘图方法。我只是不知道应该用哪些方法,或者是否存在必须注意的问题,例如性能。是否有人做过这个?


请参考此答案:https://dev59.com/FXRC5IYBdhLWcg3wD83r#1931498 - Bill
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库添加到您的项目中。


2
我真的很喜欢这个解决方案。使用代码而不是参考文献。在我看来,它应该得到更多的点赞。 - Johan Karlsson

20

1
这个链接更好:http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html - Mat Ryer
2
您可以在回答时提供示例。 - Mark
1
链接式答案应该在回答中提供关键信息,以防链接失效。 - Sascha Wolf

3
使用Swift添加渐变的方法如下:
    var view : UIView = UIView(frame: CGRectMake(0, 0, 320, 100))
    var g : CAGradientLayer = CAGradientLayer()
    g.frame = gradientView.bounds
    g.colors = ["000000".UIColor.CGColor , "111111".UIColor.CGColor]
    view.layer.insertSublayer(g, atIndex: 0)

UIColor()是一个Swift的帮助类,用于将十六进制颜色转换为RGB颜色,非常推荐使用。


"000000".UIColor.CGColor 是什么? - JSmyth
@JSmyth 这是一个Swift的String扩展,可以将6位数字字符串转换为UIColor。你可以在Github上轻松找到它。 - Reza_Rg
@reza-rg 我的意思是我提示你在你的答案中提到这一点。并不是每个人最终都使用那个扩展程序。我建议您至少添加一个指向该扩展程序的链接。除此之外,答案很好,但为了简单起见,使用标准的颜色实例化方式(例如UIColor.whiteColor().CGColor)非常容易,因为问题是关于渐变而不是颜色的十六进制表示。最后,UIColor()不是一个帮助类,它是一个内置对象。 - JSmyth

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];
}

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,请使用其他初始化程序。

0

0

对于绘制文本的视图,例如UILabelUITextViewUITextField,您应该在drawRect函数中添加渐变(请参见此文章作为示例)。

有一些很棒的UILabelUITextViewUITextField子类,可以让您轻松地添加渐变(请参见GitHub上的JBGradient)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接