#import "ViewController.h"
#import "CDRadianLayerView.h"
#import "DCMacro.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic, strong) UIView *bgView;
@property (nonatomic, strong) NSMutableArray *colorArray;
@end
@implementation ViewController
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? NSLog(@"white%@白色",[self isWhiteColor:[UIColor whiteColor]]?@"是":@"不是");
? ? NSLog(@"grayColor%@白色",[self isWhiteColor:[UIColor grayColor]]?@"是":@"不是");
? ? NSLog(@"darkGrayColor%@白色",[self isWhiteColor:[UIColor darkGrayColor]]?@"是":@"不是");
? ? NSLog(@"lightGrayColor%@白色",[self isWhiteColor:[UIColor lightGrayColor]]?@"是":@"不是");
? ? self.colorArray = [NSMutableArray array];
? ? CDRadianLayerView *view = [[CDRadianLayerView alloc] initWithFrame:CGRectMake(0, 0, SCREENWIDTH, SCREENWIDTH*2/5+StatusBarHeight+400)];
? ? view.backgroundColor = [self stringTOColor:@"#FFFFFF"];
? ? view.radian = 25;
? ? [self.view addSubview:view];
? ? self.bgView = view;
? ? self.bgView.backgroundColor = [self mostColor:[UIImage imageNamed:@"file1.JPG"]];
? ? UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, SafeTopHeight, SCREENWIDTH, 400)];
? ? scrollView.bounces = NO;
? ? scrollView.delegate = self;
? ? scrollView.backgroundColor = [UIColor clearColor];
? ? CGFloat left = 0;
? ? for (int i = 0; i<9; i++) {
? ? ? ? UIImageView *imgv = [[UIImageView alloc] initWithFrame:CGRectMake(left+15, 0, SCREENWIDTH-15*2, 400)];
? ? ? ? imgv.image = [UIImage imageNamed:[NSString stringWithFormat:@"file%d.JPG",i+1]];
? ? ? ? [scrollView addSubview:imgv];
? ? ? ? left += SCREENWIDTH;
? ? ? ? [self.colorArray addObject:[self mostColor:imgv.image]];
? ? }
? ? [self.colorArray addObject:[UIColor whiteColor]];
? ? scrollView.contentSize = CGSizeMake(left, 0);
? ? [self.view addSubview:scrollView];
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
? ? NSInteger page = scrollView.contentOffset.x/SCREENWIDTH;
? ? CGFloat value = ((int)scrollView.contentOffset.x%(int)SCREENWIDTH)/SCREENWIDTH;
? ? self.bgView.backgroundColor = [self colorGradient:value startColor:self.colorArray[page] endColor:self.colorArray[page+1]];
}
-(UIColor *)mostColor:(UIImage*)image{
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
? ? int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
#else
? ? int bitmapInfo = kCGImageAlphaPremultipliedLast;
#endif
? ? //第一步 先把圖片縮小 加快計(jì)算速度. 但越小結(jié)果誤差可能越大
? ? CGSize thumbSize=CGSizeMake(50, 50);
? ? CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
? ? CGContextRef context = CGBitmapContextCreate(NULL,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thumbSize.width,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thumbSize.height,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8,//bits per component
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? thumbSize.width*4,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? colorSpace,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitmapInfo);
? ? CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);
? ? CGContextDrawImage(context, drawRect, image.CGImage);
? ? CGColorSpaceRelease(colorSpace);
? ? //第二步 取每個(gè)點(diǎn)的像素值
? ? unsigned char* data = CGBitmapContextGetData (context);
? ? if (data == NULL) return nil;
? ? NSCountedSet *cls=[NSCountedSet setWithCapacity:thumbSize.width*thumbSize.height];
? ? for (int x=0; x<thumbSize.width; x++) {
? ? ? ? for (int y=0; y<thumbSize.height; y++) {
? ? ? ? ? ? int offset = 4*(x*y);
? ? ? ? ? ? int red = data[offset];
? ? ? ? ? ? int green = data[offset+1];
? ? ? ? ? ? int blue = data[offset+2];
? ? ? ? ? ? int alpha =? data[offset+3];
? ? ? ? ? ? NSArray *clr=@[@(red),@(green),@(blue),@(alpha)];
? ? ? ? ? ? [cls addObject:clr];
? ? ? ? }
? ? }
? ? CGContextRelease(context);
? ? //第三步 找到出現(xiàn)次數(shù)最多的那個(gè)顏色
? ? NSEnumerator *enumerator = [cls objectEnumerator];
? ? NSArray *curColor = nil;
? ? NSArray *MaxColor=nil;
? ? NSUInteger MaxCount=0;
? ? while ( (curColor = [enumerator nextObject]) != nil )
? ? {
? ? ? ? NSUInteger tmpCount = [cls countForObject:curColor];
? ? ? ? if ( tmpCount < MaxCount ) continue;
? ? ? ? MaxCount=tmpCount;
? ? ? ? MaxColor=curColor;
? ? }
? ? UIColor *color = [UIColor colorWithRed:([MaxColor[0] intValue]/255.0f) green:([MaxColor[1] intValue]/255.0f) blue:([MaxColor[2] intValue]/255.0f) alpha:([MaxColor[3] intValue]/255.0f)];
? ? return [self isWhiteColor:color]?[self stringTOColor:@"#F5F5F5"]:color;
}
- (UIColor *)stringTOColor:(NSString *)str{
? ? if (!str || [str isEqualToString:@""]) {
? ? ? ? return nil;
? ? }
? ? unsigned red,green,blue;
? ? NSRange range;
? ? range.length = 2;
? ? range.location = 1;
? ? [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&red];
? ? range.location = 3;
? ? [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&green];
? ? range.location = 5;
? ? [[NSScanner scannerWithString:[str substringWithRange:range]] scanHexInt:&blue];
? ? UIColor *color= [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:1];
? ? return color;
}
- (BOOL)isWhiteColor:(UIColor *)color
{
? ? CGFloat red = 0.0;
? ? CGFloat green = 0.0;
? ? CGFloat blue = 0.0;
? ? CGFloat alpha = 0.0;
? ? [color getRed:&red green:&green blue:&blue alpha:&alpha];
? ? return (red>0.941&&green>0.941&&blue>0.941);
}
-(UIColor *)colorGradient:(CGFloat)value startColor:(UIColor *)startColor endColor:(UIColor *)endColor
{
? ? if (value < 0) value = 0;
? ? if (value > 1) value = 1;
? ? CGFloat sred = 0.0;
? ? CGFloat sgreen = 0.0;
? ? CGFloat sblue = 0.0;
? ? CGFloat salpha = 0.0;
? ? [startColor getRed:&sred green:&sgreen blue:&sblue alpha:&salpha];
? ? CGFloat ered = 0.0;
? ? CGFloat egreen = 0.0;
? ? CGFloat eblue = 0.0;
? ? CGFloat ealpha = 0.0;
? ? [endColor getRed:&ered green:&egreen blue:&eblue alpha:&ealpha];
? ? CGFloat cursorred = sred + (ered-sred)*value;
? ? CGFloat cursorgreen = sgreen + (egreen-sgreen)*value;
? ? CGFloat cursorblue = sblue + (eblue-sblue)*value;
? ? UIColor *color = [UIColor colorWithRed:cursorred green:cursorgreen blue:cursorblue alpha:1];
? ? return color;
}
@end
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, CDRadianDirection) {
? ? CDRadianDirectionBottom? ? = 0,
? ? CDRadianDirectionTop? ? ? ? = 1,
? ? CDRadianDirectionLeft? ? ? = 2,
? ? CDRadianDirectionRight? ? ? = 3,
};
@interface CDRadianLayerView : UIView
// 圓弧方向, 默認(rèn)在下方
@property (nonatomic) CDRadianDirection direction;
// 圓弧高/寬, 可為負(fù)值障般。 正值凸, 負(fù)值凹
@property (nonatomic) CGFloat radian;
@end
#import "CDRadianLayerView.h"
@implementation CDRadianLayerView
- (void)setRadian:(CGFloat) radian
{
? ? if(radian == 0) return;
? ? CGFloat t_width = CGRectGetWidth(self.frame); // 寬
? ? CGFloat t_height = CGRectGetHeight(self.frame); // 高
? ? CGFloat height = fabs(radian); // 圓弧高度
? ? CGFloat x = 0;
? ? CGFloat y = 0;
? ? // 計(jì)算圓弧的最大高度
? ? CGFloat _maxRadian = 0;
? ? switch (self.direction) {
? ? ? ? case CDRadianDirectionBottom:
? ? ? ? case CDRadianDirectionTop:
? ? ? ? ? ? _maxRadian =? MIN(t_height, t_width / 2);
? ? ? ? ? ? break;
? ? ? ? case CDRadianDirectionLeft:
? ? ? ? case CDRadianDirectionRight:
? ? ? ? ? ? _maxRadian =? MIN(t_height / 2, t_width);
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
? ? if(height > _maxRadian){
? ? ? ? NSLog(@"圓弧半徑過(guò)大, 跳過(guò)設(shè)置橙垢。");
? ? ? ? return;
? ? }
? ? // 計(jì)算半徑
? ? CGFloat radius = 0;
? ? switch (self.direction) {
? ? ? ? case CDRadianDirectionBottom:
? ? ? ? case CDRadianDirectionTop:
? ? ? ? {
? ? ? ? ? ? CGFloat c = sqrt(pow(t_width / 2, 2) + pow(height, 2));
? ? ? ? ? ? CGFloat sin_bc = height / c;
? ? ? ? ? ? radius = c / ( sin_bc * 2);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case CDRadianDirectionLeft:
? ? ? ? case CDRadianDirectionRight:
? ? ? ? {
? ? ? ? ? ? CGFloat c = sqrt(pow(t_height / 2, 2) + pow(height, 2));
? ? ? ? ? ? CGFloat sin_bc = height / c;
? ? ? ? ? ? radius = c / ( sin_bc * 2);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
? ? // 畫(huà)圓
? ? CAShapeLayer *shapeLayer = [CAShapeLayer layer];
? ? [shapeLayer setFillColor:[[UIColor whiteColor] CGColor]];
? ? CGMutablePathRef path = CGPathCreateMutable();
? ? switch (self.direction) {
? ? ? ? case CDRadianDirectionBottom:
? ? ? ? {
? ? ? ? ? ? if(radian > 0){
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width,t_height - height);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width / 2, t_height - radius, radius, asin((radius - height ) / radius), M_PI - asin((radius - height ) / radius), NO);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width,t_height);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width / 2, t_height + radius - height, radius, 2 * M_PI - asin((radius - height ) / radius), M_PI + asin((radius - height ) / radius), YES);
? ? ? ? ? ? }
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, x, y);
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, t_width, y);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case CDRadianDirectionTop:
? ? ? ? {
? ? ? ? ? ? if(radian > 0){
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width, height);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width / 2, radius, radius, 2 * M_PI - asin((radius - height ) / radius), M_PI + asin((radius - height ) / radius), YES);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width, y);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width / 2, height - radius, radius, asin((radius - height ) / radius), M_PI - asin((radius - height ) / radius), NO);
? ? ? ? ? ? }
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, x, t_height);
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, t_width, t_height);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case CDRadianDirectionLeft:
? ? ? ? {
? ? ? ? ? ? if(radian > 0){
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, height, y);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, radius, t_height / 2, radius, M_PI + asin((radius - height ) / radius), M_PI - asin((radius - height ) / radius), YES);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, x, y);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, height - radius, t_height / 2, radius, 2 * M_PI - asin((radius - height ) / radius), asin((radius - height ) / radius), NO);
? ? ? ? ? ? }
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, t_width, t_height);
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, t_width, y);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case CDRadianDirectionRight:
? ? ? ? {
? ? ? ? ? ? if(radian > 0){
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width - height, y);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width - radius, t_height / 2, radius, 1.5 * M_PI + asin((radius - height ) / radius), M_PI / 2 + asin((radius - height ) / radius), NO);
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? CGPathMoveToPoint(path,NULL, t_width, y);
? ? ? ? ? ? ? ? CGPathAddArc(path,NULL, t_width? + radius - height, t_height / 2, radius, M_PI + asin((radius - height ) / radius), M_PI - asin((radius - height ) / radius), YES);
? ? ? ? ? ? }
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, x, t_height);
? ? ? ? ? ? CGPathAddLineToPoint(path,NULL, x, y);
? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? break;
? ? }
? ? CGPathCloseSubpath(path);
? ? [shapeLayer setPath:path];
? ? CFRelease(path);
? ? self.layer.mask = shapeLayer;
}
@end