런타임에 그라디언트 색상 배경 (단색에서 투명으로)으로 뷰를 생성하려고합니다. 그렇게하는 방법이 있습니까?
런타임에 그라디언트 색상 배경 (단색에서 투명으로)으로 뷰를 생성하려고합니다. 그렇게하는 방법이 있습니까?
답변:
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 및 endPoint를 사용 하여 그라디언트 방향 을 변경하십시오 .
이에 추가 된 다른 뷰가있는 경우 UIView
(예로서 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
은 이니셜 라이저와 유사합니다. 나는 그것이 매우 적합하다고 생각하지 않습니다.
신속한 구현 :
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의 확장 기능과 열거 형을 사용하여 허용되는 답변을 약간 확장했습니다.
내가 할이 만들처럼 스토리 보드를 사용하는 경우 아, 그리고 확실히 호출 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)
}
}
스위프트 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)
신속한 접근
이 답변은 위의 답변을 기반으로하며 회전 중에 그라디언트가 올바르게 적용되지 않는 문제를 처리하기위한 구현을 제공합니다. 그라디언트 레이어를 정사각형으로 변경하여 모든 방향으로 회전하여 올바른 그라디언트를 만들어이 문제를 해결합니다. 함수 시그니처에는 Swift variadic 인수가 포함되어있어 필요한만큼 CGColorRef (CGColor)를 전달할 수 있습니다 (샘플 사용 참조). UIView에 그라디언트를 적용 할 수 있도록 Swift 확장으로 예제도 제공됩니다.
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)
}
이는 모든 컨트롤이 UIView (또는 하위 클래스)이고 모든 UIView에 CALayer가 있으므로 그라데이션 배경을 모든 UIControl에 적용 할 수 있음을 의미합니다.
스위프트 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/
UIView의 모든 레이어 부분에 액세스하려면 QuartZCore 프레임 워크를 포함해야합니다.
스위프트 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에 그라디언트 색상을 지정하려면 (swift 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)