ฉันกำลังพยายามสร้างมุมมองที่มีพื้นหลังสีไล่ระดับสี (สีทึบถึงโปร่งใส) ตอนรันไทม์ มีวิธีทำเช่นนั้นหรือไม่?
ฉันกำลังพยายามสร้างมุมมองที่มีพื้นหลังสีไล่ระดับสี (สีทึบถึงโปร่งใส) ตอนรันไทม์ มีวิธีทำเช่นนั้นหรือไม่?
คำตอบ:
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
มีผลกระทบต่อประสิทธิภาพเล็กน้อย
view
เป็นself.view
และมันก็ทำงานได้เหมือนมีเสน่ห์ :)
gradient.frame = view.bounds
เข้าviewDidAppear()
และdidRotateFromInterfaceOrientation()
ไม่เช่นนั้นการไล่ระดับสีจะไม่ถูกปรับขนาดอย่างเหมาะสม
คุณสามารถสร้างคลาสที่กำหนดเอง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
layerClass
ไม่เป็นฟังก์ชั่นมันเป็นสถานที่ให้บริการเพื่อให้คุณมีการแทนที่มันเหมือนทรัพย์สิน: stackoverflow.com/questions/28786597/... นอกจากนี้คุณต้องใช้override init(frame: CGRect)
ตรวจสอบคำตอบนี้: stackoverflow.com/questions/27374330/... ขอบคุณ!
init(frame:CGRect)
แม้ว่า ฉันทดสอบโค้ดที่อัปเดตแล้วและใช้งานได้ดี
@IBDesignable
มีการใช้งาน
ลองสิ่งนี้มันได้ผลเช่นเดียวกับฉัน
วัตถุประสงค์ 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
หวังว่านี่จะช่วยได้บ้าง
นี่คือแนวทางที่ฉันแนะนำ
เพื่อส่งเสริมการนำกลับมาใช้ใหม่ฉันจะพูดว่าสร้างหมวดหมู่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];
viewDidLoad
viewDidLoad
จะไม่ทำงานหากเปิดตัวแอพในแนวนอน โซลูชันของฉันคือทำให้กรอบเลเยอร์พื้นหลังกว้างกว่า view.frame เพื่อชดเชยการวางแนวอื่น ๆ
เนื่องจากฉันต้องการการไล่ระดับสีเพียงประเภทเดียวในแอปของฉันฉันจึงสร้างคลาสย่อยของ 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 ฉันไม่คิดว่ามันเหมาะสมนัก
การใช้งาน 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)
ฉันได้ขยายคำตอบที่ได้รับการยอมรับเล็กน้อยโดยใช้ฟังก์ชั่นเสริมของ 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)
}
}
ฉันใช้งานสิ่งนี้อย่างรวดเร็วด้วยส่วนขยาย:
สวิฟท์ 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)
แนวทางที่รวดเร็ว
คำตอบนี้สร้างขึ้นจากคำตอบข้างต้นและให้การใช้งานสำหรับการจัดการกับปัญหาการไล่ระดับสีที่ไม่ได้ใช้อย่างถูกต้องระหว่างการหมุน มันเป็นที่น่าพอใจปัญหานี้โดยการเปลี่ยนชั้นลาดเป็นสี่เหลี่ยมเพื่อให้การหมุนในทุกทิศทางส่งผลให้เกิดการไล่ระดับสีที่ถูกต้อง ลายเซ็นของฟังก์ชั่นประกอบด้วยอาร์กิวเมนต์ 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)
}
CAGradientLayer
สิ่งที่คุณกำลังมองหาอยู่ ทุกคนUIView
มีเลเยอร์ - ในเลเยอร์นั้นคุณสามารถเพิ่มเลเยอร์ย่อยได้เช่นเดียวกับที่คุณสามารถเพิ่มพรีวิว ประเภทหนึ่งที่เฉพาะเจาะจงคือCAGradientLayer
, ซึ่งคุณให้อาเรย์ของสีเพื่อไล่ระดับสี
ตัวอย่างหนึ่งคือเสื้อคลุมเรียบง่ายสำหรับมุมมองไล่ระดับสี:
http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/
โปรดทราบว่าคุณต้องรวมกรอบงาน QuartZCore เพื่อเข้าถึงส่วนเลเยอร์ทั้งหมดของ UIView
สวิฟท์ 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]
}
}
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])
มุมมองที่รวดเร็วง่าย ๆ ตามเวอร์ชั่นของ 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]
โซลูชันของฉันคือการสร้าง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);
เป็นความคิดที่ดีที่จะเรียกโซลูชันข้างต้นเพื่ออัพเดทเลเยอร์ใน
viewDidLayoutSubviews
เพื่อรับมุมมองที่อัปเดตอย่างถูกต้อง
สวิฟท์ 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)
ใน 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)
}
}
ฉันใช้สิ่งนี้ในรหัสของฉัน
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];
ตอนนี้ฉันสามารถเห็นการไล่ระดับสีในมุมมองของฉัน
เพื่อให้สีไล่ระดับสีแก่ 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)