背景色隨輪播圖變化

#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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝠检,一起剝皮案震驚了整個(gè)濱河市牲览,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沾谓,老刑警劉巖破喻,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件职祷,死亡現(xiàn)場(chǎng)離奇詭異盖灸,居然都是意外死亡蚁鳖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)赁炎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)醉箕,“玉大人,你說(shuō)我怎么就攤上這事徙垫〖タ悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵姻报,是天一觀的道長(zhǎng)己英。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吴旋,這世上最難降的妖魔是什么损肛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荣瑟,結(jié)果婚禮上治拿,老公的妹妹穿的比我還像新娘。我一直安慰自己笆焰,他們只是感情好劫谅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嚷掠,像睡著了一般捏检。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叠国,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天未檩,我揣著相機(jī)與錄音,去河邊找鬼粟焊。 笑死冤狡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的项棠。 我是一名探鬼主播悲雳,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼香追!你這毒婦竟也來(lái)了合瓢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤透典,失蹤者是張志新(化名)和其女友劉穎晴楔,沒(méi)想到半個(gè)月后顿苇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡税弃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年纪岁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片则果。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幔翰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出西壮,到底是詐尸還是另有隱情遗增,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布款青,位于F島的核電站做修,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抡草。R本人自食惡果不足惜缓待,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠牲。 院中可真熱鬧,春花似錦步悠、人聲如沸签杈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)答姥。三九已至,卻和暖如春谚咬,著一層夾襖步出監(jiān)牢的瞬間鹦付,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工择卦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敲长,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓秉继,卻偏偏與公主長(zhǎng)得像祈噪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚辑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容