iOS 自动环绕页面四周布局的抽奖页面

#import "ViewController.h"

typedef NS_ENUM(NSUInteger, FrameType) {
    FrameTypeFirst,
    FrameTypeRight,
    FrameTypeDown,
    FrameTypeLeft,
    FrameTypeUp
};

@interface ViewController ()
@property(nonatomic,strong)NSMutableArray *arrView;
/// 转圈圈下标
@property(nonatomic,assign)NSInteger index;
/// 获奖下标
@property(nonatomic,assign)NSInteger jiangLiIndex;
/// 模拟转圈圈的圈数
@property(nonatomic,assign)NSInteger quanShu;
/// 间隔时间逐步减慢
@property(nonatomic,assign)NSTimeInterval time;
/// 开始结束标志
@property(nonatomic,assign)BOOL action;
/// 一共走了多少步
@property(nonatomic,assign)NSInteger step;
/// 哪步停止
@property(nonatomic,assign)NSInteger stopStep;
@property(nonatomic,strong)UILabel *labelCenter;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.action = NO;
    [self initUI];
}

#pragma mark - 点击事件
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (self.action == NO &&
        self.index == 0 &&
        self.step == 0 )
    {
        [self fuWei];
        self.jiangLiIndex = [self getRandomNumber:0 to:(int)self.arrView.count];
        NSLog(@"结果  = %ld",self.jiangLiIndex);
        for (UILabel *label in  self.arrView)
        {
            [label setBackgroundColor:[UIColor  whiteColor]];
        }
        self.stopStep = self.arrView.count * self.quanShu + self.jiangLiIndex;
        [self actionZhuanQuanQuan];
        self.action = YES;
    }
}

#pragma mark - 模拟抽奖结果
-(int)getRandomNumber:(int)from to:(int)to
{
    return (int)(from + (arc4random() % (to - from + 1)));
}

#pragma mark - 模拟转圈圈
-(void)actionZhuanQuanQuan
{
    UILabel *label = self.arrView[self.index];
    [label setBackgroundColor:[UIColor  redColor]];
    if (self.stopStep - self.step <= 10)
    {
        self.time += 0.01f;
    }
    if (_stopStep == _step)
    {
        [self fuWei];
        self.action = NO;
        return;
    }
    if (self.index >= self.arrView.count - 1 )
    {
        self.index = -1;
        self.quanShu ++;
    }
    self.index ++ ;
    __weak __typeof(&*self)weakSelf = self;
    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.time/*延迟执行时间*/ * NSEC_PER_SEC));
    dispatch_after(delayTime, dispatch_get_main_queue(), ^{
        [label setBackgroundColor:[UIColor  whiteColor]];
        weakSelf.step ++ ;
        [weakSelf actionZhuanQuanQuan];
    });
}
#pragma mark - 复位
-(void)fuWei
{
    self.labelCenter.text = self.action == YES ? @"开始" :@"抽奖中。。。";
    
    if (_stopStep == _step  &&
        _step > 0)
    {
        self.labelCenter.text =[NSString stringWithFormat:@"抽奖结果%ld\n点击开始抽奖",self.jiangLiIndex];
    }
    self.time = 0.006f;
    self.index = 0;
    self.step = 0;
    self.quanShu = 3;
}

-(void)initUI
{
    CGFloat wspace = 0;
    CGFloat hSpace = 0;
    
    CGFloat leftopSpace = 12;
    CGFloat rIghtopSpace = 12;
    
    CGFloat topSpace = 60;
    CGFloat botomSpace = 12;

    CGFloat sCreenW = self.view.frame.size.width - leftopSpace - rIghtopSpace;
    CGFloat sCreenH = self.view.frame.size.height - topSpace - botomSpace;
    
    CGFloat x = leftopSpace;
    CGFloat y = topSpace;
    CGFloat w = 40;
    CGFloat h = 40;

    FrameType frameType;

    for (int i = 0 ; i < 1000 ;  i++)
    {
        if (i == 0)
        {
            frameType = FrameTypeFirst;
        }
        else if (x + w - wspace + rIghtopSpace < sCreenW &&
            y == topSpace)
        {
            frameType = FrameTypeRight;
        }
        else if (y + h - hSpace + botomSpace < sCreenH
            && x !=  rIghtopSpace
            && x < sCreenW)
        {
            frameType = FrameTypeDown;
        }
        else
        {
            if (x == leftopSpace)
            {
                frameType = FrameTypeUp;
            }
            else
            {
                frameType = FrameTypeLeft;
            }
        }
        
        switch (frameType)
        {
            case FrameTypeFirst:
                break;
            case FrameTypeRight:
                x += w;
                x += wspace;
                break;
            case FrameTypeDown:
                y += h;
                y += hSpace;
                break;
            case FrameTypeLeft:
                x -= w;
                x -= wspace;
                break;
            case FrameTypeUp:
                y -= h;
                y -= hSpace;
                break;
            default:
                break;
        }
        UIView *view = self.arrView.firstObject;
        CGRect frame =  CGRectMake(x, y, w, h);
        if(CGRectEqualToRect(view.frame,frame))
        {
            break;
        }
        UILabel *label = [[UILabel alloc]init];
        label.frame = frame;
        label.text = [NSString stringWithFormat:@"%d",i];
        [label setTextAlignment:(NSTextAlignmentCenter)];
        label.textColor = [UIColor blackColor];
        label.layer.borderWidth = 1;
        label.layer.borderColor = [UIColor grayColor].CGColor;
        [self.view addSubview:label];
        [self.arrView addObject:label];
//        NSLog(@"%@",NSStringFromCGRect(frame));
    }
    
    [self.view addSubview:self.labelCenter];
    
}

-(UILabel *)labelCenter{
    if (!_labelCenter)
    {
        UILabel *labelCenter = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 50)];
        labelCenter.center = self.view.center;
        labelCenter.numberOfLines = 0;
        [labelCenter setTextAlignment:(NSTextAlignmentCenter)];
        labelCenter.text = @"开始";
        _labelCenter = labelCenter;
    }
    return _labelCenter;
}

-(NSMutableArray *)arrView
{
    if (!_arrView)
    {
        _arrView = [NSMutableArray array];
    }
    return _arrView;
}

@end

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值