美文网首页
iOS 拼图验证 字符验证

iOS 拼图验证 字符验证

作者: 丶天空蓝丶 | 来源:发表于2020-08-31 17:30 被阅读0次

    demo传送门

    效果

    拼图验证.gif 字符验证.gif 滑动解锁.gif

    实现代码

    
    #import "LoginSliderView.h"
    
    #pragma mark -- 屏幕
    #define SCREEN_BOUNDS [UIScreen mainScreen].bounds
    #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
    #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
    
    //iPhone宽适配
    #define WSXFrom8(x) ([[UIScreen mainScreen] bounds].size.width / 375.0 * x)
    
    // 颜色定义
    #define kColor(r,g,b) [UIColor colorWithRed:(r / 255.0) green:(g / 255.0) blue:(b / 255.0) alpha:1.0]
    #define kColorA(r,g,b,a) [UIColor colorWithRed:(r / 255.0) green:(g / 255.0) blue:(b / 255.0) alpha:a]
    
    @interface LoginSliderView ()
    
    @property (nonatomic,assign)ViewType viewType;
    
    @property (nonatomic,strong)UIView *backView;
    @property (nonatomic,strong)UILabel *failLabel;
    
    @property (nonatomic,assign)CGFloat backImageWhidth;
    @property (nonatomic,assign)CGFloat leftWhidth;
    
    @property (nonatomic,assign)CGFloat imageWhidth;
    @property (nonatomic,assign)CGFloat leftImageWhidth;
    
    @property (nonatomic,assign)CGPoint randomPoint;
    
    @property(nonatomic,strong)NSTimer *myTimer;
    
    @property (nonatomic,strong)UIImageView *backImageView;
    @property (nonatomic,strong)UIImageView *leftImageView;
    @property (nonatomic,strong)UIView *sliderBackView;
    @property (nonatomic,strong)UIView *progressView;
    @property (nonatomic,strong)UIImageView *thumbImgView;
    @property (nonatomic,strong)UIView *hintView;
    
    @property (nonatomic,strong)UILabel *titleLabel;
    @property (nonatomic,copy)NSString *titleString;
    @property (nonatomic,copy)NSString *chooseString;
    
    @end
    
    @implementation LoginSliderView
    
    - (instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:SCREEN_BOUNDS];
        if (self) {
        }
        return self;
    }
    
    #pragma mark - 初始化
    -(void)show:(ViewType)viewType {
        
        [self initData];
        [self initView];
        
        _viewType = viewType;
        //    拼图验证
        if (viewType == ViewTypePuzzle) {
            [self initPuzzleView];
        } else if (viewType == ViewTypeSlider) {
            [self initSliderView];
        } else if (viewType == ViewTypeRandomChar) {
            [self initCharView];
            
        }
        
    }
    
    #pragma mark - 数据初始化
    -(void)initData {
        
        //    背景图片宽
        _backImageWhidth = WSXFrom8(260);
        //    左边距
        _leftWhidth = WSXFrom8(20);
        
        //    拼图验证截图大小
        _imageWhidth = WSXFrom8(50);
        //    拼图验证截图初始化左边距
        _leftImageWhidth = WSXFrom8(10);
        
        //    记录位置
        _randomPoint = CGPointZero;
    }
    
    #pragma mark - 通用背景
    -(void)initView {
        
        /***************************背景模糊*********************************/
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
        UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        visualEffectView.frame = self.bounds;
        visualEffectView.alpha = 0.7;
        [self addSubview:visualEffectView];
        
        _backView = [[UIView alloc] initWithFrame:CGRectMake(WSXFrom8(75 / 2), SCREEN_HEIGHT / 2 - WSXFrom8(150), WSXFrom8(300), WSXFrom8(300))];
        _backView.backgroundColor = [UIColor whiteColor];
        _backView.clipsToBounds = YES;
        [self addSubview:_backView];
        
        UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];
        cancelButton.frame = CGRectMake(WSXFrom8(150), SCREEN_HEIGHT / 2 + WSXFrom8(180), WSXFrom8(75), WSXFrom8(45));
        [cancelButton setTitle:@"取消" forState:UIControlStateNormal];
        [cancelButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [cancelButton setBackgroundColor:[UIColor blueColor]];
        [cancelButton addTarget:self action:@selector(cancelButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:cancelButton];
        
        
        _failLabel = [[UILabel alloc] initWithFrame:CGRectMake(WSXFrom8(20), WSXFrom8(300), WSXFrom8(200), WSXFrom8(30))];
        _failLabel.textColor = [UIColor redColor];
        _failLabel.text = @"小伙子,不行啊!";
        [_backView addSubview:_failLabel];
        
        UIButton *changeButton = [UIButton buttonWithType:UIButtonTypeCustom];
        changeButton.frame = CGRectMake(WSXFrom8(250), WSXFrom8(250), WSXFrom8(32), WSXFrom8(32));
        [changeButton setImage:[UIImage imageNamed:@"refresh"] forState:UIControlStateNormal];
        [changeButton addTarget:self action:@selector(refreshButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [_backView addSubview:changeButton];
        
        if (_viewType == ViewTypeSlider) {
            changeButton.hidden = YES;
        }
        
        [[UIApplication sharedApplication].keyWindow addSubview:self];
    }
    
    
    #pragma mark -
    #pragma mark === 拼图验证 ===
    #pragma mark -
    -(void)initPuzzleView {
        
        //    背景图片
        _backImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"backImage"]];
        _backImageView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(20), _backImageWhidth, WSXFrom8(150));
        [_backView addSubview:_backImageView];
        
        [self initRandPuzzleView];
        
        //    滑块背景
        _sliderBackView = [[UIView alloc] initWithFrame:CGRectMake(WSXFrom8(20), WSXFrom8(200), _backImageWhidth, WSXFrom8(20))];
        _sliderBackView.backgroundColor = kColor(222, 222, 222);
        _sliderBackView.layer.cornerRadius = WSXFrom8(10);
        [_backView addSubview:_sliderBackView];
        
        //    已经滑动部分
        _progressView = [[UIView alloc] initWithFrame:CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(30), WSXFrom8(20))];
        _progressView.backgroundColor = [UIColor blueColor];
        _progressView.layer.cornerRadius = WSXFrom8(10);
        [_backView addSubview:_progressView];
        
        //    滑块
        _thumbImgView = [[UIImageView alloc] initWithFrame:CGRectMake(WSXFrom8(30), WSXFrom8(185), _imageWhidth, _imageWhidth)];
        _thumbImgView.image = [UIImage imageNamed:@"slide_buttonn"];
        _thumbImgView.userInteractionEnabled = YES;
        [_backView addSubview:_thumbImgView];
        //    添加手势
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
        [_thumbImgView addGestureRecognizer:pan];
        
        
        //    滑块上引导动画
        _hintView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, WSXFrom8(60), WSXFrom8(20))];
        [_sliderBackView addSubview:_hintView];
        
        CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.colors = @[(__bridge id)kColorA(222, 222, 222, 0).CGColor, (__bridge id)kColorA(255, 0, 0, 0.7).CGColor,(__bridge id)kColorA(222, 222, 222, 0).CGColor];
        gradientLayer.locations = @[@0, @0.5, @1];
        gradientLayer.startPoint = CGPointMake(0, 0);
        gradientLayer.endPoint = CGPointMake(1, 0);
        gradientLayer.frame = _hintView.bounds;
        [_hintView.layer insertSublayer:gradientLayer atIndex:0];
        
        [self cycingHintView:YES];
    }
    
    #pragma mark - 拼图验证上面随机位置生成
    -(void)initRandPuzzleView {
        
        //    移除上面子视图
        [_backImageView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
        [_backImageView.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
        
        [self getRandomPoint];
        
        UIBezierPath *path = [self getCodePath];
        
        //    在背景图片上生成一个目标位置
        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
        maskLayer.frame = CGRectMake(self.randomPoint.x, self.randomPoint.y, WSXFrom8(50), WSXFrom8(50));
        maskLayer.path = path.CGPath;
        maskLayer.strokeColor = [UIColor orangeColor].CGColor;
        maskLayer.fillColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5].CGColor;
        [_backImageView.layer addSublayer:maskLayer];
        
        //    左边可滑动小图
        UIImage *leftImage = [self imageFromImage:_backImageView.image inRect:CGRectMake(self.randomPoint.x, self.randomPoint.y, _imageWhidth, _imageWhidth)];
        
        UIImageView *leftImageView = [[UIImageView alloc] init];
        leftImageView.frame = CGRectMake(WSXFrom8(10), self.randomPoint.y, _imageWhidth, _imageWhidth);
        [_backImageView addSubview:leftImageView];
        leftImageView.layer.shadowColor = [UIColor blackColor].CGColor;
        // 设置阴影偏移量
        leftImageView.layer.shadowOffset = CGSizeMake(0,0);
        // 设置阴影透明度
        leftImageView.layer.shadowOpacity = 1;
        // 设置阴影半径
        leftImageView.layer.shadowRadius = 5;
        leftImageView.clipsToBounds = NO;
        
        //    截取图片
        CGSize size = CGSizeMake(_imageWhidth, _imageWhidth);
        //开启上下文
        UIGraphicsBeginImageContextWithOptions(size, NO, 0);
        //实现裁剪
        [path addClip];
        //把图片绘制到上下文中
        [leftImage drawAtPoint:CGPointMake(0, 0)];
        //从上下文中取出图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        //关闭上下文
        UIGraphicsEndImageContext();
        leftImageView.image = newImage;
        _leftImageView = leftImageView;
    }
    
    #pragma mark - 生成随机位置
    -(void)getRandomPoint {
        //    图片大小260*150
        //    中间截图大小50*50
        //    从80到80+130之间选一个点当起点
        CGFloat x = (arc4random() % 130) + 80;
        //    从0到100之间选一个点当起点
        CGFloat y = (arc4random() % 100);
        
        self.randomPoint = CGPointMake(WSXFrom8(x), WSXFrom8(y));
        
    }
    
    #pragma mark - 生产一个花边的Bezier曲线路径
    -(UIBezierPath *)getCodePath {
        
        CGFloat codeSize = WSXFrom8(40);
        CGFloat offset = WSXFrom8(10);
        
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, offset)];
        [path addLineToPoint:CGPointMake(codeSize * 0.5 - offset,offset)];
        //    曲线
        [path addQuadCurveToPoint:CGPointMake(codeSize * 0.5 + offset, offset) controlPoint:CGPointMake(codeSize * 0.5, -offset*2 + offset)];
        [path addLineToPoint:CGPointMake(codeSize, offset)];
        
        [path addLineToPoint:CGPointMake(codeSize,codeSize*0.5-offset + offset)];
        [path addQuadCurveToPoint:CGPointMake(codeSize, codeSize*0.5+offset + offset) controlPoint:CGPointMake(codeSize+offset*2, codeSize*0.5 + offset)];
        [path addLineToPoint:CGPointMake(codeSize, codeSize + offset)];
        
        [path addLineToPoint:CGPointMake(codeSize*0.5+offset,codeSize + offset)];
        [path addQuadCurveToPoint:CGPointMake(codeSize*0.5-offset, codeSize + offset) controlPoint:CGPointMake(codeSize*0.5, codeSize-offset*2 + offset)];
        [path addLineToPoint:CGPointMake(0, codeSize + offset)];
        
        [path addLineToPoint:CGPointMake(0,codeSize*0.5+offset + offset)];
        [path addQuadCurveToPoint:CGPointMake(0, codeSize*0.5-offset + offset) controlPoint:CGPointMake(0+offset*2, codeSize*0.5 + offset)];
        [path addLineToPoint:CGPointMake(0, offset)];
        
        [path stroke];
        return path;
    }
    
    #pragma mark - 根据图片和路径在图片上扣一个小图出来
    - (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect{
        
        //把像 素rect 转化为 点rect(如无转化则按原图像素取部分图片)
        CGFloat scale = [UIScreen mainScreen].scale;
        CGFloat x= rect.origin.x*scale,y=rect.origin.y*scale,w=rect.size.width*scale,h=rect.size.height*scale;
        CGRect dianRect = CGRectMake(x, y, w, h);
        
        //截取部分图片并生成新图片
        CGImageRef sourceImageRef = [image CGImage];
        CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, dianRect);
        UIImage *newImage = [UIImage imageWithCGImage:newImageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
        return newImage;
    }
    
    #pragma mark - 手势处理
    - (void)pan:(UIPanGestureRecognizer *)pan {
        
        [self cycingHintView:NO];
        
        CGPoint point = [pan translationInView:_thumbImgView];
        //    手势结束
        if (pan.state == UIGestureRecognizerStateEnded) {
            
            //        滑动位置跟目标位置重复度误差在+—5之内算通过
            if (point.x > (_randomPoint.x - WSXFrom8(15)) && point.x < (_randomPoint.x - WSXFrom8(5))) {
                [self.myTimer invalidate];
                self.myTimer = nil;
                [self removeFromSuperview];
            } else {
                //            滑动位置误差过大,提示错误
                [self cycingHintView:YES];
                [self faileHandle];
                _progressView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(30), WSXFrom8(20));
                _thumbImgView.frame = CGRectMake(WSXFrom8(30), WSXFrom8(185), _imageWhidth, _imageWhidth);
                _leftImageView.frame = CGRectMake(WSXFrom8(10), self.randomPoint.y, _imageWhidth, _imageWhidth);
            }
            
        } else {
            
            //        因为起始位置是10,所以小于10就滑出去了,将其设置为在0位置
            if (point.x < -WSXFrom8(10)) {
                
                _progressView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(20), WSXFrom8(20));
                _thumbImgView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(185), _imageWhidth, _imageWhidth);
                _leftImageView.frame = CGRectMake(0, self.randomPoint.y, _imageWhidth, _imageWhidth);
                
                //            大于200就超过右边了滑出去了,将其设置为在210位置
            } else if ( point.x > WSXFrom8(200)) {
                
                _progressView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(260), WSXFrom8(20));
                _thumbImgView.frame = CGRectMake(WSXFrom8(230), WSXFrom8(185), _imageWhidth, _imageWhidth);
                _leftImageView.frame = CGRectMake(WSXFrom8(210), self.randomPoint.y, _imageWhidth, _imageWhidth);
                
            } else {
                
                _progressView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(30) + point.x, WSXFrom8(20));
                _thumbImgView.frame = CGRectMake(WSXFrom8(30) + point.x, WSXFrom8(185), _imageWhidth, _imageWhidth);
                
                _leftImageView.frame = CGRectMake(WSXFrom8(10) + point.x, self.randomPoint.y, _imageWhidth, _imageWhidth);
                
            }
            
        }
    }
    
    
    #pragma mark -
    #pragma mark === 滑动解锁 ===
    #pragma mark -
    //算是拼图验证简化版,为了方便理解,抽离出来,可以直接在拼图验证界面上处理
    -(void)initSliderView {
        
        //    背景图片
        _backImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"backImage"]];
        _backImageView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(20), _backImageWhidth, WSXFrom8(150));
        [_backView addSubview:_backImageView];
        
        _imageWhidth = WSXFrom8(40);
        
        //    滑块背景
        _sliderBackView = [[UIView alloc] initWithFrame:CGRectMake(WSXFrom8(20), WSXFrom8(200), WSXFrom8(260), WSXFrom8(40))];
        _sliderBackView.backgroundColor = kColor(222, 222, 222);
        _sliderBackView.layer.cornerRadius = WSXFrom8(20);
        _sliderBackView.clipsToBounds = YES;
        [_backView addSubview:_sliderBackView];
        
        //    滑块上动画
        _hintView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, WSXFrom8(50), WSXFrom8(40))];
        [_sliderBackView addSubview:_hintView];
        
        //   已经滑动部分
        _progressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, WSXFrom8(30), WSXFrom8(40))];
        _progressView.backgroundColor = [UIColor blueColor];
        [_sliderBackView addSubview:_progressView];
        
        //    滑块
        _thumbImgView = [[UIImageView alloc] initWithFrame:CGRectMake(WSXFrom8(30), WSXFrom8(200), _imageWhidth, _imageWhidth)];
        _thumbImgView.image = [UIImage imageNamed:@"slide_buttonn"];
        _thumbImgView.userInteractionEnabled = YES;
        [_backView addSubview:_thumbImgView];
        
        //    引导动画
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panSlider:)];
        [_thumbImgView addGestureRecognizer:pan];
        
        CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.colors = @[(__bridge id)kColorA(222, 222, 222, 0).CGColor, (__bridge id)kColorA(255, 0, 0, 0.7).CGColor,(__bridge id)kColorA(222, 222, 222, 0).CGColor];
        gradientLayer.locations = @[@0, @0.5, @1];
        gradientLayer.startPoint = CGPointMake(0, 0);
        gradientLayer.endPoint = CGPointMake(1, 0);
        gradientLayer.frame = _hintView.bounds;
        [_hintView.layer insertSublayer:gradientLayer atIndex:0];
        
        [self cycingHintView:YES];
    }
    
    #pragma mark - 滑动解锁手势处理
    - (void)panSlider:(UIPanGestureRecognizer *)pan {
        
        [self cycingHintView:NO];
        
        CGPoint point = [pan translationInView:_thumbImgView];
        
        if (pan.state == UIGestureRecognizerStateEnded) {
    //
    //        结束了回到原位置
            [self cycingHintView:YES];
            [self faileHandle];
            _progressView.frame = CGRectMake(0, 0, WSXFrom8(30), WSXFrom8(40));
            _thumbImgView.frame = CGRectMake(WSXFrom8(30), WSXFrom8(200), _imageWhidth, _imageWhidth);
            
        } else {
            
            //        因为起始位置是10,所以小于10就滑出去了,将其设置为在0位置
            if (point.x < -WSXFrom8(10)) {
                
                _progressView.frame = CGRectMake(0, 0, WSXFrom8(20), WSXFrom8(40));
                _thumbImgView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(200), _imageWhidth, _imageWhidth);
        
            //            大于210,说明滑到头了,成功
            } else if ( point.x > WSXFrom8(210)) {
                
                [self.myTimer invalidate];
                self.myTimer = nil;
                [self removeFromSuperview];
                
            } else {
                
                _progressView.frame = CGRectMake(0, 0, WSXFrom8(30) + point.x, WSXFrom8(40));
                _thumbImgView.frame = CGRectMake(WSXFrom8(30) + point.x, WSXFrom8(200), _imageWhidth, _imageWhidth);
                
            }
            
        }
    
    }
    
    
    #pragma mark -
    #pragma mark === 随机字符验证 ===
    #pragma mark -
    -(void)initCharView {
        
        //    背景图片
        _backImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"backImage"]];
        _backImageView.frame = CGRectMake(WSXFrom8(20), WSXFrom8(20), _backImageWhidth, WSXFrom8(150));
        _backImageView.userInteractionEnabled = YES;
        [_backView addSubview:_backImageView];
        
        //    提示文字
        _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(WSXFrom8(20), WSXFrom8(180), WSXFrom8(260), WSXFrom8(30))];
        _titleLabel.textAlignment = NSTextAlignmentCenter;
        _titleLabel.font = [UIFont systemFontOfSize:15];
        [_backView addSubview:_titleLabel];
        
        [self initRandomCharView];
        
    }
    
    -(void)initRandomCharView {
        
        NSInteger index = 8;
        NSString *chooseText = @"";
        NSMutableArray *dataArray = [NSMutableArray array];
    //    生产8个汉字
        while (index) {
            
            NSString *randStr = [self getRandomChinese];
            if (![dataArray containsObject:randStr]) {
                [dataArray addObject:randStr];
                if (index > 4) {
                    chooseText = [chooseText stringByAppendingFormat:@"%@",randStr];
                }
                index --;
            }
            
        }
        
    //    提示文字显示
        NSMutableAttributedString *tipsString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"请按顺序点击 %@ 完成验证",chooseText]];
        [tipsString addAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17],NSForegroundColorAttributeName : [UIColor redColor]} range:NSMakeRange(7, 4)];
        _titleLabel.attributedText = tipsString;
    
        _titleString = chooseText;
        _chooseString = @"";
        _randomPoint = CGPointZero;
        
        //    移除上面子视图
        [_backImageView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
        
    //    生成随机按钮
        for (NSInteger i = 0; i < 8; i ++) {
            NSInteger index = arc4random() % dataArray.count;
            NSString *titString = dataArray[index];
            [dataArray removeObject:titString];
            
            _randomPoint = [self getRanPoint:i];
            
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.frame = CGRectMake(_randomPoint.x, _randomPoint.y, WSXFrom8(32), WSXFrom8(32));
            button.tag = i;
            [button setBackgroundColor:[UIColor whiteColor]];
            button.layer.cornerRadius = WSXFrom8(16);
            [button setTitle:titString forState:UIControlStateNormal];
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
            button.transform = CGAffineTransformMakeRotation(M_PI / 100.0 * (arc4random() % 200));
            [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
            [_backImageView addSubview:button];
        }
    }
    
    
    #pragma mark - 生成一个随机汉字
    -(NSString *)getRandomChinese {
        
        NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    
        NSInteger randomH = 0xA1+arc4random()%(0xFE - 0xA1+1);
        NSInteger randomL = 0xB0+arc4random()%(0xF7 - 0xB0+1);
        NSInteger number = (randomH<<8)+randomL;
        NSData *data = [NSData dataWithBytes:&number length:2];
    
        NSString *string = [[NSString alloc] initWithData:data encoding:gbkEncoding];
    
        return string;
        
    }
    
    #pragma mark - 生产一个随机起始位置
    -(CGPoint)getRanPoint:(NSInteger)index {
        
        CGFloat defaultW = (index % 4 + 1) * WSXFrom8(65);
        CGFloat defaultH = index > 3 ? WSXFrom8(75) : 0;
        
        CGPoint randomPoint = CGPointZero;
        
        CGFloat fromX = (index % 4) == 0 ? 0 : (_randomPoint.x + WSXFrom8(32));
        
        randomPoint.x = [self getRandomNumberFrom:fromX To:defaultW - WSXFrom8(32)];
        randomPoint.y = [self getRandomNumberFrom:defaultH To:defaultH + WSXFrom8(75) - WSXFrom8(32)];
        
        return randomPoint;
    }
    
    -(CGFloat)getRandomNumberFrom:(CGFloat)from To:(CGFloat)to {
        
        NSInteger scope = [[NSString stringWithFormat:@"%lf",floorf(to - from)] integerValue];
        
        NSInteger rand = arc4random();
        
        CGFloat number = (rand % scope) + from;
        
        return number;
        
    }
    
    #pragma mark - 选择处理
    -(void)buttonClick:(UIButton *)button {
        if (!button.selected) {
            button.selected = YES;
            [button setBackgroundColor:[UIColor orangeColor]];
            NSLog(@"%@",button.titleLabel.text);
            
            _chooseString = [_chooseString stringByAppendingFormat:@"%@",button.titleLabel.text];
            if (_chooseString.length >= 4) {
                if ([_chooseString isEqualToString:_titleString]) {
                    
                    [self removeFromSuperview];
                    
                } else {
                    [self faileHandle];
                    [self initRandomCharView];
                }
            }
            
        }
    }
    
    #pragma mark -
    #pragma mark === 通用 ===
    #pragma mark -
    
    #pragma mark - 引导手势是否开启
    -(void)cycingHintView:(BOOL)isSlide {
        
        if (isSlide) {
            if (!self.myTimer) {
                self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(upData) userInfo:nil repeats:YES];
            } else {
                [self.myTimer setFireDate:[NSDate distantPast]];
            }
        } else {
            [self.myTimer setFireDate:[NSDate distantFuture]];
        }
    }
    
    -(void)upData {
        
        [UIView animateWithDuration:0.5 animations:^{
            
            self.hintView.transform = CGAffineTransformMakeTranslation(WSXFrom8(200), 0);
            
        } completion:^(BOOL finished) {
            
            self.hintView.transform = CGAffineTransformIdentity;
            
        }];
    }
    
    #pragma mark - 退出
    -(void)cancelButtonClick:(UIButton *)button {
        [self.myTimer invalidate];
        self.myTimer = nil;
        [self removeFromSuperview];
    }
    
    #pragma mark - 刷新
    -(void)refreshButtonClick:(UIButton *)button {
        
        if (_viewType == ViewTypePuzzle) {
            [self initRandPuzzleView];
        } else if (_viewType == ViewTypeRandomChar) {
            [self initRandomCharView];
            
        }
    }
    
    #pragma mark - 失败提示
    -(void)faileHandle {
        
        _failLabel.frame = CGRectMake(WSXFrom8(20), WSXFrom8(250), WSXFrom8(200), WSXFrom8(30));
        
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(boom) object:nil];
        
        [self performSelector:@selector(boom) withObject:nil afterDelay:4];
        
    }
    
    -(void)boom {
        _failLabel.frame = CGRectMake(WSXFrom8(20), WSXFrom8(300), WSXFrom8(200), WSXFrom8(30));
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS 拼图验证 字符验证

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