美文网首页
背景色随轮播图变化

背景色随轮播图变化

作者: 呵呵一笑很倾城ebing | 来源:发表于2019-08-28 11:31 被阅读0次

#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

相关文章

  • 背景色随轮播图变化

    #import "ViewController.h" #import "CDRadianLayerView.h" ...

  • 轮播图

    最终效果图 效果说明: 运行后六张图片自动轮播,同时下方对应的小矩形背景色变蓝。 当鼠标停放在图片上时,图片轮播动...

  • 无标题文章

    轮播图分为:传统轮播图、间歇轮播图、呼吸轮播图、无缝滚动轮播图等。它们各具特色,各有用处。 1.传统轮播图 第一步...

  • 轮播图

    轮播图分为:传统轮播图、间歇轮播图、呼吸轮播图、无缝滚动轮播图等。 1.传统轮播图 第一步,得到元素 第二步,设置...

  • 现金红包

    每日红包 轮播图 详情图 周末红包 轮播图 详情图 圣诞红包 轮播图 详情图

  • day7_作业

    轮播图1 轮播图2

  • [iOS]定制性强的广告轮播图--SCAdView

    @[无限轮播图] @[3D轮播图] @[广告轮播图] SCAdView Statement If my code ...

  • 普通奖品

    卡西欧小方块 轮播图 详情图 三只松鼠大礼包 轮播图 详情图 天猫精灵 轮播图 详情图 小米蓝牙无线耳机 轮播图 ...

  • 轮播图心得

    轮播图 写轮播图之前我们要认识到几个问题:一、什么是轮播图?二、怎么实现轮播效果?三、轮播图还有什么小功能可以实现...

  • 第五周学习内容

    焦点图轮播特效之原理、焦点图轮播样式之布局、焦点图轮播之箭头切换、焦点图轮播之无限滚动。 js简介、用法、输出。

网友评论

      本文标题:背景色随轮播图变化

      本文链接:https://www.haomeiwen.com/subject/eljpectx.html