색 그라데이션이 있는 UIView를 프로그래밍 방식으로 만듭니다.
런타임에 그라데이션 색상 배경(솔리드 색에서 투명 색)으로 보기를 생성하려고 합니다.그렇게 하는 방법이 있나요?
목표-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 및 endPoint를 사용하여 그라데이션 방향을 변경합니다.
에 경우UIView
:UILabel
의하는 것을 .UIView
[UIColor clearColor]
따라서 하위 보기의 배경색 대신 그라데이션 보기가 표시됩니다.「」를 사용합니다.clearColor
이치노
클래스를 수 .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
- 서브레이어 작성 불필요(메모리 사용량 감소)
해봐 나한테는 마법처럼 먹혔어
목표 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;
}
이 에서 Import하면 .ViewController
기타 한 """ " " " " " " "subclass
:, 요.
CAGradientLayer *backgroundLayer = [CAGradientLayer purpleGradientLayer];
backgroundLayer.frame = self.view.frame;
[self.view.layer insertSublayer:backgroundLayer atIndex:0];
extension UIView {
func applyGradient(isVertical: Bool, colorArray: [UIColor]) {
layer.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])
앱 전체에서 하나의 그라데이션만 필요했기 때문에 UIView의 서브클래스를 만들고 초기화할 때 그라데이션 레이어를 고정 색상으로 미리 구성했습니다.UIView의 이니셜라이저는 configureGradientLayer-method를 호출하여 CAGradientLayer를 설정합니다.
DDGradient View.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
Swift의 확장기능과 enum을 사용하여 승인된 답변을 조금 확장했습니다.
, 저처럼 꼭 , 리, 리, 그, 화, 화, 화로 전화하세요.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)
}
}
신속한 도입:
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)
이 기능을 확장하여 신속하게 구현했습니다.
스위프트 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 인수가 포함되어 있어 필요에 따라 CGCollorRef(CGCollor)를 전달할 수 있습니다(사용 예 참조).또, 임의의 UIView에 그라데이션(gradient)을 적용할 수 있도록, 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 프레임워크를 포함해야 합니다.
위의 솔루션을 호출하여 위의 레이어를 업데이트하는 것이 좋습니다.
viewDidLayoutSubviews
보기를 올바르게 업데이트하다
Swift 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]
}
}
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]
은 의의해 my my my를 이다.UIView
with with with sub로 분류하다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);
SWIFT 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)
이 프레임워크는 히스토리보드의 그라데이션 및 기타 UI 수정에 적합합니다.IBAnimable을 탑재한 Interface Builder에서 App Store 지원 앱을 위한 사용자 정의 UI, 상호 작용, 탐색, 전환 및 애니메이션을 설계 및 프로토타입으로 제작할 수 있습니다.
이를 통해 뷰를 선택하고 클래스를 AnimatableView로 설정하고 Interface Builder 속성에서 그라데이션 및 미리보기 결과를 실시간으로 설정할 수 있습니다.
UIView에 그라데이션 적용 방법에 대해서는, 여기를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/23074539/programmatically-create-a-uiview-with-color-gradient
'source' 카테고리의 다른 글
Windows 명령줄에서 명령 실행 시간을 측정하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
---|---|
로컬 데이터베이스를 Windows Azure 데이터베이스로 복원하는 방법 (0) | 2023.04.22 |
뷰 모델에서 WPF의 TextBox에 포커스 설정 (0) | 2023.04.22 |
Azure CosmosDB에서 LIKE 쿼리를 작성하는 방법 (0) | 2023.04.22 |
다른 사용자로 PowerShell 실행 및 스크립트 실행 (0) | 2023.04.22 |