一薯演、背景
最近的需求開發(fā)中有需要給一個label的背景色設(shè)為漸變色,谷歌了眾多答案后丢胚,基本都是使用CAGradientLayer 進行設(shè)置的翩瓜,具體方法可以自行搜索,有很多很詳細的文章携龟。但是兔跌,這種設(shè)置有一個問題,那就是這種方法設(shè)置漸變色峡蟋,本質(zhì)是對layer的設(shè)置坟桅,如果是對button這種內(nèi)部層級比較多得控件,那是比較好處理蕊蝗,如果是label這種層級比較單一的控件,會發(fā)現(xiàn),設(shè)置以后并不會生效宠能,如果強行將此layer插入到最上層椰苟,那么label上的text就不會顯示出來了,這顯然不是我們想要的效果子漩。
二豫喧、神奇的colorWithPatternImage
+ (UIColor *)colorWithPatternImage:(UIImage *)image;
這個方法可以直接通過改變view.backgroundColor的值,來給view設(shè)置你想要的任何背景幢泼,甚至是一張圖片紧显,但是他也有個問題,如果設(shè)置圖片為背景色缕棵,不同的圖片大小孵班,會占用不同的內(nèi)存,所以需要慎用挥吵。于是聯(lián)想起之前的CAGradientLayer 我采取了如下方案重父。
三、給View的backgroundColor的方法
給UIColor添加一個分類忽匈,就是設(shè)置我們需要的設(shè)置漸變色的方法
//
// UIColor+Gradient.h
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, GradientColorDirection) {
GradientColorDirectionLevel,//水平漸變
GradientColorDirectionVertical,//豎直漸變
GradientColorDirectionDownDiagonalLine,//向上對角線漸變
GradientColorDirectionUpwardDiagonalLine,//向下對角線漸變
};
@interface UIColor (Gradient)
/// 設(shè)置漸變色
/// @param size 需要漸變的大小
/// @param direction 漸變的方向
/// @param startcolor 漸變的開始顏色
/// @param endColor 漸變的結(jié)束顏色
+ (instancetype)gradientColorWithSize:(CGSize)size
direction:(GradientColorDirection)direction
startColor:(UIColor *)startcolor
endColor:(UIColor *)endColor;
@end
//
// UIColor+Gradient.m
#import "UIColor+Gradient.h"
@implementation UIColor (Gradient)
+ (instancetype)gradientColorWithSize:(CGSize)size
direction:(GradientColorDirection)direction
startColor:(UIColor *)startcolor
endColor:(UIColor *)endColor {
if (CGSizeEqualToSize(size, CGSizeZero) || !startcolor || !endColor) {
return nil;
}
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = CGRectMake(0, 0, size.width, size.height);
CGPoint startPoint = CGPointMake(0.0, 0.0);
if (direction == GradientColorDirectionUpwardDiagonalLine) {
startPoint = CGPointMake(0.0, 1.0);
}
CGPoint endPoint = CGPointMake(0.0, 0.0);
switch (direction) {
case GradientColorDirectionVertical:
endPoint = CGPointMake(0.0, 1.0);
break;
case GradientColorDirectionDownDiagonalLine:
endPoint = CGPointMake(1.0, 1.0);
break;
case GradientColorDirectionUpwardDiagonalLine:
endPoint = CGPointMake(1.0, 0.0);
break;
default:
endPoint = CGPointMake(1.0, 0.0);
break;
}
gradientLayer.startPoint = startPoint;
gradientLayer.endPoint = endPoint;
gradientLayer.colors = @[(__bridge id)startcolor.CGColor, (__bridge id)endColor.CGColor];
UIGraphicsBeginImageContext(size);
[gradientLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return [UIColor colorWithPatternImage:image];
}
@end
我們用了個非常取巧的方法給所需的View添加了一個可以設(shè)置漸變色的方法房午,因為本質(zhì)上是layer的繪制,所以并不會很吃內(nèi)存丹允。
使用的話:
UILabel *label = UILabel.alloc.init;
label.backgroundColor = [UIColor gradientColorWithSize:label.frame.size
direction:GradientColorDirectionLevel
startColor:[UIColor colorWithRed:176.0 green:224.0 blue:230.0 alpha:1]
endColor:[UIColor colorWithRed:65.0 green:105.0 blue:225.0 alpha:1]];
這里我只是以lable舉例郭厌,大家可以給任何有backgroundColor的屬性設(shè)置袋倔,但是前提一定要知道他的size,如果是用masonry布局進行計算的話折柠,可能就需要用其他更取巧的方式了宾娜。
四、總結(jié)
工作中總會遇到奇奇怪怪的問題扇售,所以籍此來記錄一下前塔,希望廣大開發(fā)者能少走些彎路。
轉(zhuǎn)載請注明出處承冰。