สร้าง UIView โดยทางโปรแกรมด้วยการไล่ระดับสี


292

ฉันกำลังพยายามสร้างมุมมองที่มีพื้นหลังสีไล่ระดับสี (สีทึบถึงโปร่งใส) ตอนรันไทม์ มีวิธีทำเช่นนั้นหรือไม่?


2
นี่เป็นเครื่องมือเล็ก ๆ ที่มีประโยชน์ที่สร้างโค้ดการไล่ระดับสีสำหรับคุณitunes.apple.com/gb/app/gradient-creator/id1031070259?mt=12
burrGGG

การสร้างสีไล่ระดับสีโดยใช้ CAGradientLayer appcoda.com/cagradientlayer
สูงสุด

คำตอบ:


694

Objective-C:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
CAGradientLayer *gradient = [CAGradientLayer layer];

gradient.frame = view.bounds;
gradient.colors = @[(id)[UIColor whiteColor].CGColor, (id)[UIColor blackColor].CGColor];

[view.layer insertSublayer:gradient atIndex:0];

สวิฟท์:

let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
let gradient = CAGradientLayer()

gradient.frame = view.bounds
gradient.colors = [UIColor.white.cgColor, UIColor.black.cgColor]

view.layer.insertSublayer(gradient, at: 0)

ข้อมูล : ใช้ StartPoint และปลายทางที่จะเปลี่ยนทิศทางของการไล่ระดับสี

หากมีการเพิ่มมุมมองอื่น ๆ ลงในส่วนนี้UIView(เช่น a UILabel) คุณอาจต้องการพิจารณาตั้งค่าสีพื้นหลังของมุมมองเหล่านั้นUIViewเพื่อ[UIColor clearColor]ให้มุมมองไล่ระดับสีแสดงแทนสีพื้นหลังสำหรับมุมมองย่อย การใช้clearColorมีผลกระทบต่อประสิทธิภาพเล็กน้อย


13
+1 สำหรับจำนวนรหัสที่สั้นที่สุดจากโซลูชันทั้งหมด ฉันเพิ่งเพิ่มตัวควบคุมมุมมองที่มีอยู่ของฉันเปลี่ยน 2 refs viewเป็นself.viewและมันก็ทำงานได้เหมือนมีเสน่ห์ :)
Ergin

4
ที่เกี่ยวข้องยังเป็นที่ที่จะเพิ่มรหัสนี้ ฉันต้องการโพสต์ต่อไปนี้เพื่อให้สามารถใช้งานได้: stackoverflow.com/a/20059268/1480518
Garrett Disco

13
สิ่งนี้ช่วยฉันได้มาก! พลาดส่วน CGColor ไปทุกที่! ขอบคุณ
Gyfis

48
อย่าลืมใช้ 'startPoint' และ 'endpoint' เพื่อเปลี่ยนทิศทางการไล่ระดับสี ค่าเริ่มต้นคือ (0.5, 0) และ (0.5,1) - จากทิศทางบนสู่ล่าง
Valentin Shamardin

12
เมื่อ UIView ของฉันใช้ AutoLayout ฉันต้องโทรgradient.frame = view.boundsเข้าviewDidAppear()และdidRotateFromInterfaceOrientation()ไม่เช่นนั้นการไล่ระดับสีจะไม่ถูกปรับขนาดอย่างเหมาะสม
EricRobertBrewer

70

คุณสามารถสร้างคลาสที่กำหนดเองGradientView:

สวิฟท์ 5

class GradientView: UIView {
    override open class var layerClass: AnyClass {
       return CAGradientLayer.classForCoder()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let gradientLayer = layer as! CAGradientLayer
        gradientLayer.colors = [UIColor.white.cgColor, UIColor.black.cgColor]
    }
}

ในกระดานเรื่องราวให้ตั้งค่าประเภทชั้นเรียนเป็นมุมมองที่คุณต้องการให้มีพื้นหลังไล่ระดับสี:

ป้อนคำอธิบายรูปภาพที่นี่

วิธีนี้จะดีกว่าในวิธีต่อไปนี้:

  • ไม่จำเป็นต้องตั้งค่าเฟรมของ CLayer
  • ใช้NSConstraintตามปกติบนUIView
  • ไม่จำเป็นต้องสร้างเลเยอร์ย่อย (ใช้หน่วยความจำน้อยกว่า)

1
สวิฟท์เมื่อวันที่ 3 layerClassไม่เป็นฟังก์ชั่นมันเป็นสถานที่ให้บริการเพื่อให้คุณมีการแทนที่มันเหมือนทรัพย์สิน: stackoverflow.com/questions/28786597/... นอกจากนี้คุณต้องใช้override init(frame: CGRect)ตรวจสอบคำตอบนี้: stackoverflow.com/questions/27374330/... ขอบคุณ!
LaloLoop

สวัสดี @LaloLoop ขอบคุณสำหรับความคิดเห็น! ฉันอัปเดตรหัสแล้ว ฉันไม่คิดว่าฉันจะต้องแทนที่init(frame:CGRect)แม้ว่า ฉันทดสอบโค้ดที่อัปเดตแล้วและใช้งานได้ดี
Yuchen Zhong

@Yuchen Zhong มันยอดเยี่ยมใน IB แต่ทำงานได้ในแอพ มีสาเหตุใดที่ทำให้ไม่แสดงผลใน IB หาก@IBDesignableมีการใช้งาน
Alexander Volkov

@AlexanderVolkov อาจมีปัญหาอื่นอีกหรือไม่ เราใช้มันอย่างนั้นในกระดานเรื่องราวและดูเหมือนจะไม่มีปัญหาอะไร คุณสามารถดีบักสตอรีบอร์ดของคุณและดูว่าบรรทัดใดหยุดทำงาน
Yuchen Zhong

1
ทางออกที่ดีที่สุด!
Baran Emre

40

ลองสิ่งนี้มันได้ผลเช่นเดียวกับฉัน

วัตถุประสงค์ C

ฉันได้ตั้งค่าพื้นหลังไล่ระดับสีRGBเป็นUIview

   UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,35)];
   CAGradientLayer *gradient = [CAGradientLayer layer];
   gradient.frame = view.bounds;
   gradient.startPoint = CGPointZero;
   gradient.endPoint = CGPointMake(1, 1);
   gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:34.0/255.0 green:211/255.0 blue:198/255.0 alpha:1.0] CGColor],(id)[[UIColor colorWithRed:145/255.0 green:72.0/255.0 blue:203/255.0 alpha:1.0] CGColor], nil];
   [view.layer addSublayer:gradient];

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต: - Swift3 +

รหัส : -

 var gradientView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 35))
 let gradientLayer:CAGradientLayer = CAGradientLayer()
 gradientLayer.frame.size = self.gradientView.frame.size
 gradientLayer.colors = 
 [UIColor.white.cgColor,UIColor.red.withAlphaComponent(1).cgColor] 
//Use diffrent colors
 gradientView.layer.addSublayer(gradientLayer)

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถเพิ่มจุดเริ่มต้นและจุดสิ้นสุดของการไล่ระดับสี

  gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
  gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับคำอธิบายรายละเอียดเพิ่มเติมดูCAGradientLayer Doc

หวังว่านี่จะช่วยได้บ้าง


36

นี่คือแนวทางที่ฉันแนะนำ

เพื่อส่งเสริมการนำกลับมาใช้ใหม่ฉันจะพูดว่าสร้างหมวดหมู่CAGradientLayerและเพิ่มการไล่ระดับสีที่คุณต้องการเป็นวิธีการเรียน ระบุพวกเขาในheaderไฟล์ดังนี้:

#import <QuartzCore/QuartzCore.h>

@interface CAGradientLayer (SJSGradients)

+ (CAGradientLayer *)redGradientLayer;
+ (CAGradientLayer *)blueGradientLayer;
+ (CAGradientLayer *)turquoiseGradientLayer;
+ (CAGradientLayer *)flavescentGradientLayer;
+ (CAGradientLayer *)whiteGradientLayer;
+ (CAGradientLayer *)chocolateGradientLayer;
+ (CAGradientLayer *)tangerineGradientLayer;
+ (CAGradientLayer *)pastelBlueGradientLayer;
+ (CAGradientLayer *)yellowGradientLayer;
+ (CAGradientLayer *)purpleGradientLayer;
+ (CAGradientLayer *)greenGradientLayer;

@end

จากนั้นในไฟล์ใช้งานของคุณระบุการไล่ระดับสีแต่ละครั้งด้วยไวยากรณ์นี้

+ (CAGradientLayer *)flavescentGradientLayer
{
    UIColor *topColor = [UIColor colorWithRed:1 green:0.92 blue:0.56 alpha:1];
    UIColor *bottomColor = [UIColor colorWithRed:0.18 green:0.18 blue:0.18 alpha:1];

    NSArray *gradientColors = [NSArray arrayWithObjects:(id)topColor.CGColor, (id)bottomColor.CGColor, nil];
    NSArray *gradientLocations = [NSArray arrayWithObjects:[NSNumber numberWithInt:0.0],[NSNumber numberWithInt:1.0], nil];

    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.colors = gradientColors;
    gradientLayer.locations = gradientLocations;

    return gradientLayer;
}

จากนั้นเพียงนำเข้าหมวดหมู่นี้ในของคุณViewControllerหรือสิ่งอื่น ๆ ที่จำเป็นsubclassและใช้งานในลักษณะนี้:

CAGradientLayer *backgroundLayer = [CAGradientLayer purpleGradientLayer];
backgroundLayer.frame = self.view.frame;
[self.view.layer insertSublayer:backgroundLayer atIndex:0];

คุณควรใส่รหัสไว้ที่ไหน วงจรชีวิตวิธีอะไร? viewdidappear ทำให้ดูเหมือนว่าสายเกินไป viewdidload และ viewdidappear ทำให้มันไม่ทำงานในขณะที่หมุน viewdidlayoutsubviews ทำงานได้ดีขึ้นสำหรับการหมุน แต่ก็ยังดูจบลงเล็กน้อย
Adam Johns

ฉันใส่มันเองviewDidLoad
Sam Fischer

1
เมื่อฉันใส่เข้าไปมันviewDidLoadจะไม่ทำงานหากเปิดตัวแอพในแนวนอน โซลูชันของฉันคือทำให้กรอบเลเยอร์พื้นหลังกว้างกว่า view.frame เพื่อชดเชยการวางแนวอื่น ๆ
Adam Johns

2
viewDidLoad ทำงานได้คุณเพียงแค่ต้องตั้งค่า AutoResizingMask โดยใช้ [backgroundLayer setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
ekscrypto

21

เนื่องจากฉันต้องการการไล่ระดับสีเพียงประเภทเดียวในแอปของฉันฉันจึงสร้างคลาสย่อยของ UIView และกำหนดค่าระดับการไล่ระดับสีบนการเริ่มต้นด้วยสีคงที่ล่วงหน้า ค่าเริ่มต้นของ UIView เรียกใช้configureGradientLayer -method ซึ่งกำหนดค่า CAGradientLayer:

DDGradientView.h:

#import <UIKit/UIKit.h>

@interface DDGradientView : UIView {

}
@end

DDGradientView.m:

#import "DDGradientView.h"

@implementation DDGradientView

// Change the views layer class to CAGradientLayer class
+ (Class)layerClass
{
    return [CAGradientLayer class];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self configureGradientLayer];
    }
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if(self) {
        [self configureGradientLayer];
    }
    return self;
}

// Make custom configuration of your gradient here   
- (void)configureGradientLayer {
    CAGradientLayer *gLayer = (CAGradientLayer *)self.layer;
    gLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor lightGrayColor] CGColor], nil];
}
@end

ชื่อเมธอดinitGradientLayerคล้ายกับ initializer ฉันไม่คิดว่ามันเหมาะสมนัก
DawnSong

@ รุ่งอรุณจุดที่ดีฉันเปลี่ยนเป็น 'configureGradientLayer'
blauzahn

12

การใช้งาน Swift:

var gradientLayerView: UIView = UIView(frame: CGRectMake(0, 0, view.bounds.width, 50))
var gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = gradientLayerView.bounds
gradient.colors = [UIColor.grayColor().CGColor, UIColor.clearColor().CGColor]
gradientLayerView.layer.insertSublayer(gradient, atIndex: 0)
self.view.layer.insertSublayer(gradientLayerView.layer, atIndex: 0)

11

ฉันได้ขยายคำตอบที่ได้รับการยอมรับเล็กน้อยโดยใช้ฟังก์ชั่นเสริมของ Swift รวมถึง enum

โอ้และถ้าคุณใช้ Storyboard อย่างที่ฉันทำให้โทรgradientBackground(from:to:direction:)เข้าviewDidLayoutSubviews()หรือใหม่กว่า

สวิฟท์ 3

enum GradientDirection {
    case leftToRight
    case rightToLeft
    case topToBottom
    case bottomToTop
}

extension UIView {
    func gradientBackground(from color1: UIColor, to color2: UIColor, direction: GradientDirection) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [color1.cgColor, color2.cgColor]

        switch direction {
        case .leftToRight:
            gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
            gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        case .rightToLeft:
            gradient.startPoint = CGPoint(x: 1.0, y: 0.5)
            gradient.endPoint = CGPoint(x: 0.0, y: 0.5)
        case .bottomToTop:
            gradient.startPoint = CGPoint(x: 0.5, y: 1.0)
            gradient.endPoint = CGPoint(x: 0.5, y: 0.0)
        default:
            break
        }

        self.layer.insertSublayer(gradient, at: 0)
    }
}

10

ฉันใช้งานสิ่งนี้อย่างรวดเร็วด้วยส่วนขยาย:

สวิฟท์ 3

extension UIView {
    func addGradientWithColor(color: UIColor) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [UIColor.clear.cgColor, color.cgColor]

        self.layer.insertSublayer(gradient, at: 0)
    }
}

Swift 2.2

extension UIView {
    func addGradientWithColor(color: UIColor) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = [UIColor.clearColor().CGColor, color.CGColor]

        self.layer.insertSublayer(gradient, atIndex: 0)
    }
}

ไม่ฉันสามารถตั้งค่าการไล่ระดับสีในทุกมุมมองเช่นนี้:

myImageView.addGradientWithColor(UIColor.blue)

การโทรแบบ Swift3 จะต้องเป็นเช่น: myImageView.addGradientWithColor (สี: UIColor.blue)
mgyky

8

แนวทางที่รวดเร็ว

คำตอบนี้สร้างขึ้นจากคำตอบข้างต้นและให้การใช้งานสำหรับการจัดการกับปัญหาการไล่ระดับสีที่ไม่ได้ใช้อย่างถูกต้องระหว่างการหมุน มันเป็นที่น่าพอใจปัญหานี้โดยการเปลี่ยนชั้นลาดเป็นสี่เหลี่ยมเพื่อให้การหมุนในทุกทิศทางส่งผลให้เกิดการไล่ระดับสีที่ถูกต้อง ลายเซ็นของฟังก์ชั่นประกอบด้วยอาร์กิวเมนต์ Variadic Swift ที่อนุญาตให้ส่งผ่าน CGColorRef จำนวนมาก (CGColor) เท่าที่จำเป็น (ดูการใช้ตัวอย่าง) นอกจากนี้ยังมีตัวอย่างเป็นส่วนขยาย Swift เพื่อให้สามารถใช้การไล่ระดับสีกับ UIView ใด ๆ

   func configureGradientBackground(colors:CGColorRef...){

        let gradient: CAGradientLayer = CAGradientLayer()
        let maxWidth = max(self.view.bounds.size.height,self.view.bounds.size.width)
        let squareFrame = CGRect(origin: self.view.bounds.origin, size: CGSizeMake(maxWidth, maxWidth))
        gradient.frame = squareFrame

        gradient.colors = colors
        view.layer.insertSublayer(gradient, atIndex: 0)
    }

ใช้:

ใน viewDidLoad ...

  override func viewDidLoad() {
        super.viewDidLoad()
        configureGradientBackground(UIColor.redColor().CGColor, UIColor.whiteColor().CGColor)
  }

การขยายการใช้งาน

extension CALayer {


    func configureGradientBackground(colors:CGColorRef...){

        let gradient = CAGradientLayer()

        let maxWidth = max(self.bounds.size.height,self.bounds.size.width)
        let squareFrame = CGRect(origin: self.bounds.origin, size: CGSizeMake(maxWidth, maxWidth))
        gradient.frame = squareFrame

        gradient.colors = colors

        self.insertSublayer(gradient, atIndex: 0)
    }

}

ตัวอย่างการใช้ส่วนขยาย:

 override func viewDidLoad() {
        super.viewDidLoad()

        self.view.layer.configureGradientBackground(UIColor.purpleColor().CGColor, UIColor.blueColor().CGColor, UIColor.whiteColor().CGColor)
 }

ซึ่งหมายความว่าพื้นหลังไล่ระดับสีสามารถใช้กับ UIControl ใดก็ได้เนื่องจากการควบคุมทั้งหมดเป็น UIViews (หรือคลาสย่อย) และ UIViews ทั้งหมดมี CALayers

สวิฟต์ 4

การขยายการใช้งาน

extension CALayer {
    public func configureGradientBackground(_ colors:CGColor...){

        let gradient = CAGradientLayer()

        let maxWidth = max(self.bounds.size.height,self.bounds.size.width)
        let squareFrame = CGRect(origin: self.bounds.origin, size: CGSize(width: maxWidth, height: maxWidth))
        gradient.frame = squareFrame

        gradient.colors = colors

        self.insertSublayer(gradient, at: 0)
    }    
}

ตัวอย่างการใช้ส่วนขยาย:

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.layer.configureGradientBackground(UIColor.purple.cgColor, UIColor.blue.cgColor, UIColor.white.cgColor)
}

5

CAGradientLayerสิ่งที่คุณกำลังมองหาอยู่ ทุกคนUIViewมีเลเยอร์ - ในเลเยอร์นั้นคุณสามารถเพิ่มเลเยอร์ย่อยได้เช่นเดียวกับที่คุณสามารถเพิ่มพรีวิว ประเภทหนึ่งที่เฉพาะเจาะจงคือCAGradientLayer, ซึ่งคุณให้อาเรย์ของสีเพื่อไล่ระดับสี

ตัวอย่างหนึ่งคือเสื้อคลุมเรียบง่ายสำหรับมุมมองไล่ระดับสี:

http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/

โปรดทราบว่าคุณต้องรวมกรอบงาน QuartZCore เพื่อเข้าถึงส่วนเลเยอร์ทั้งหมดของ UIView


4

สวิฟท์ 4:

แสดงการไล่ระดับสีใน IB อย่างถูกต้อง:

@IBDesignable public class GradientView: UIView {

    override open class var layerClass: AnyClass {
        return CAGradientLayer.classForCoder()
    }

    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        configureGradientLayer()
    }

    public override init(frame: CGRect) {
        super.init(frame: frame)
        configureGradientLayer()
    }

    func configureGradientLayer() {
        let gradientLayer = layer as! CAGradientLayer
        gradientLayer.colors = [UIColor(hex: 0x003399).cgColor, UIColor(hex: 0x00297b).cgColor]
    }
}

4
extension UIView {

    func applyGradient(isVertical: Bool, colorArray: [UIColor]) {
        if let sublayers = layer.sublayers {
            sublayers.filter({ $0 is CAGradientLayer }).forEach({ $0.removeFromSuperlayer() })
        }

        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = colorArray.map({ $0.cgColor })
        if isVertical {
            //top to bottom
            gradientLayer.locations = [0.0, 1.0]
        } else {
            //left to right
            gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
        }

        backgroundColor = .clear
        gradientLayer.frame = bounds
        layer.insertSublayer(gradientLayer, at: 0)
    }

}

การใช้งาน

someView.applyGradient(isVertical: true, colorArray: [.green, .blue])

3

มุมมองที่รวดเร็วง่าย ๆ ตามเวอร์ชั่นของ Yuchen

class GradientView: UIView {
    override class func layerClass() -> AnyClass { return CAGradientLayer.self }

    lazy var gradientLayer: CAGradientLayer = {
        return self.layer as! CAGradientLayer
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

}

จากนั้นคุณสามารถใช้ gradientLayer หลังจากเริ่มต้นเช่นนี้ ...

someView.gradientLayer.colors = [UIColor.whiteColor().CGColor, UIColor.blackColor().CGColor]

3

โซลูชันของฉันคือการสร้างUIViewคลาสย่อยที่CAGradientLayerสามารถเข้าถึงได้เป็นคุณสมบัติแบบอ่านอย่างเดียว วิธีนี้จะช่วยให้คุณสามารถปรับแต่งการไล่ระดับสีตามที่คุณต้องการและคุณไม่จำเป็นต้องจัดการกับการเปลี่ยนแปลงเค้าโครง การใช้คลาสย่อย:

@interface GradientView : UIView

@property (nonatomic, readonly) CAGradientLayer *gradientLayer;

@end

@implementation GradientView

+ (Class)layerClass
{
    return [CAGradientLayer class];
}

- (CAGradientLayer *)gradientLayer
{
    return (CAGradientLayer *)self.layer;
}

@end

การใช้งาน:

self.iconBackground = [GradientView new];
[self.background addSubview:self.iconBackground];
self.iconBackground.gradientLayer.colors = @[(id)[UIColor blackColor].CGColor, (id)[UIColor whiteColor].CGColor];
self.iconBackground.gradientLayer.startPoint = CGPointMake(1.0f, 1.0f);
self.iconBackground.gradientLayer.endPoint = CGPointMake(0.0f, 0.0f);

3

เป็นความคิดที่ดีที่จะเรียกโซลูชันข้างต้นเพื่ออัพเดทเลเยอร์ใน

viewDidLayoutSubviews

เพื่อรับมุมมองที่อัปเดตอย่างถูกต้อง


2

สวิฟท์ 3

เพื่อเพิ่มเลเยอร์ไล่ระดับสีบนมุมมองของคุณ

  • ผูกเต้าเสียบมุมมองของคุณ

    @IBOutlet var YOURVIEW : UIView!
  • กำหนด CAGradientLayer ()

    var gradient = CAGradientLayer()
  • นี่คือรหัสที่คุณต้องเขียนใน viewDidLoad ของคุณ

    YOURVIEW.layoutIfNeeded()

    gradient.startPoint = CGPoint(x: CGFloat(0), y: CGFloat(1)) gradient.endPoint = CGPoint(x: CGFloat(1), y: CGFloat(0)) gradient.frame = YOURVIEW.bounds gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor] gradient.colors = [ UIColor(red: 255.0/255.0, green: 56.0/255.0, blue: 224.0/255.0, alpha: 1.0).cgColor,UIColor(red: 86.0/255.0, green: 13.0/255.0, blue: 232.0/255.0, alpha: 1.0).cgColor,UIColor(red: 16.0/255.0, green: 173.0/255.0, blue: 245.0/255.0, alpha: 1.0).cgColor] gradient.locations = [0.0 ,0.6 ,1.0] YOURVIEW.layer.insertSublayer(gradient, at: 0)


1
ฉันใช้วิธีการนี้เปลี่ยน "topview" เป็นชื่อของ IBoutlet ของฉันเพื่อการดู ฉันลบบรรทัด "SearchView"
jessi

แผนดี - อาจสังเกตว่าคุณสามารถใช้การไล่ระดับสีใดสีหนึ่งได้ ดังนั้นหากคุณใส่เครื่องหมายกำกับการไล่ระดับสีอย่างง่ายโดยใช้สี UI ที่มีชื่อภาพจะเหมือนกัน แต่ถ้าคุณใส่ความคิดเห็นอีกอันหนึ่งการไล่ระดับสีจะขึ้นอยู่กับสีแดงเป็นสีเขียว ผู้ใช้สามารถทำอย่างใดอย่างหนึ่ง
jessi

1

ใน Swift 3.1 ฉันได้เพิ่มส่วนขยายนี้ไปยัง UIView

import Foundation
import UIKit
import CoreGraphics


extension UIView {
    func gradientOfView(withColours: UIColor...) {

        var cgColours = [CGColor]()

        for colour in withColours {
            cgColours.append(colour.cgColor)
        }
        let grad = CAGradientLayer()
        grad.frame = self.bounds
        grad.colors = cgColours
        self.layer.insertSublayer(grad, at: 0)
    }
}

ซึ่งฉันก็โทรด้วย

    class OverviewVC: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

            self.view.gradientOfView(withColours: UIColor.red,UIColor.green, UIColor.blue)

        }
}

0

ฉันใช้สิ่งนี้ในรหัสของฉัน

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 31.0f)];
view1.backgroundColor = [UIColor clearColor];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view1.bounds;
UIColor *topColor = [UIColor colorWithRed:132.0/255.0 green:222.0/255.0 blue:109.0/255.0 alpha:1.0];
UIColor *bottomColor = [UIColor colorWithRed:31.0/255.0 green:150.0/255.0 blue:99.0/255.0 alpha:1.0];
gradient.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];


[view1.layer insertSublayer:gradient atIndex:0];

ตอนนี้ฉันสามารถเห็นการไล่ระดับสีในมุมมองของฉัน


0

เพื่อให้สีไล่ระดับสีแก่ UIView (รวดเร็ว 4.2)

func makeGradientLayer(`for` object : UIView, startPoint : CGPoint, endPoint : CGPoint, gradientColors : [Any]) -> CAGradientLayer {
        let gradient: CAGradientLayer = CAGradientLayer()
        gradient.colors = gradientColors
        gradient.locations = [0.0 , 1.0]
        gradient.startPoint = startPoint
        gradient.endPoint = endPoint
        gradient.frame = CGRect(x: 0, y: 0, w: object.frame.size.width, h: object.frame.size.height)
        return gradient
    }

วิธีใช้

let start : CGPoint = CGPoint(x: 0.0, y: 1.0)
let end : CGPoint = CGPoint(x: 1.0, y: 1.0)

let gradient: CAGradientLayer = makeGradientLayer(for: cell, startPoint: start, endPoint: end, gradientColors: [
                    UIColor(red:0.92, green:0.07, blue:0.4, alpha:1).cgColor,
                    UIColor(red:0.93, green:0.11, blue:0.14, alpha:1).cgColor
                    ])

self.vwTemp.layer.insertSublayer(gradient, at: 0)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.