背景色随轮播图变化

#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


    //第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大

    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);




    //第二步 取每个点的像素值

    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);


    //第三步 找到出现次数最多的那个颜色

    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

// 圆弧方向, 默认在下方

@property (nonatomic) CDRadianDirection direction;

// 圆弧高/宽, 可为负值。 正值凸, 负值凹

@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;


    // 计算圆弧的最大高度

    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(@"圆弧半径过大, 跳过设置。");

        return;

    }


    // 计算半径

    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;

    }


    // 画圆

    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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容