使用CGContextRef绘制彩票走势图

前一篇博客有提到最近在搞彩票走势图,期间遇到了很多问题,也踩了不少坑,抽出时间来整理下思路,总结下自己在画图过程中遇到的问题,为以后做到未雨绸缪,话不多说,我们直接进入正题,
首先,我们严格遵循MVC架构,直接在view里面绘图,创建view视图,重写view的初始化方法;

.h中申明方法
- (instancetype)initWithFrame:(CGRect)frame dataArray:(NSArray<NSDictionary *> *)dataArray;//此处用来接收数据
.m中实现方法
- (instancetype)initWithFrame:(CGRect)frame dataArray:(NSArray<NSDictionary *> *)dataArray {
    if (self = [super initWithFrame:frame]) {
        self.dataArray = dataArray;//此处接收到的listArray为所有传过来的数据
    }
    return self;
}
#pragma mark --- 由于此处可能会有scrollView上下、左右联动效果,因而,我们绘制4个scrollView分别代表,奖期、球的个数、开奖结果以及底部的(出现次数、平均遗漏、最大遗漏、最大连出)我们分别用懒加载来实现、

#pragma mark -- 最大出现次数 appearNums
- (BottomNumberView *)bottomView {
    if (!_bottomView) {
        //获取数据中是多少位数
        _bottomView = [[BottomNumberView alloc] initWithNumber:[[self.dataArray lastObject] objectForKey:@"appearNums"]];
        [self addSubview:_bottomView];
    }
    return _bottomView;
}

#pragma mark -- 懒加载最大遗漏  maxDrop
- (BottomNumberView2 *)maxYiLouView
{
    if (!_maxYiLouView) {
        _maxYiLouView = [[BottomNumberView2 alloc]initWithNumber:[[self.dataArray lastObject] objectForKey:@"maxDrop"]];
        [self addSubview:_maxYiLouView];
    }
    return _maxYiLouView;
}

#pragma mark -- 最大连出  maxAppear
- (BottomNumberView3 *)maxLianChuView
{
    if (!_maxLianChuView) {
        _maxLianChuView = [[BottomNumberView3 alloc]initWithNumber:[[self.dataArray lastObject] objectForKey:@"maxAppear"]];
        [self addSubview:_maxLianChuView];
    }
    return _maxLianChuView;
}
#pragma mark --    懒加载 平均遗漏  avgDrop
- (BottomNumberView1 *)yiLouView
{
    if (!_yiLouView) {
        _yiLouView = [[BottomNumberView1 alloc] initWithNumber:[[self.dataArray lastObject] objectForKey:@"avgDrop"]];
        [self addSubview:_yiLouView];
    }
    return _yiLouView;
}
#pragma mark -- 设置scrollView联动 用bounces属性来实现
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.x <= 0)) {
        scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
    }else if (scrollView.contentOffset.x + scrollView.frame.size.width >= scrollView.contentSize.width) {
        scrollView.contentOffset = CGPointMake(scrollView.contentSize.width - scrollView.frame.size.width, scrollView.contentOffset.y);
    }
    self.periodsView.transform = CGAffineTransformMakeTranslation(scrollView.contentOffset.x, 0);
    self.topView.transform = CGAffineTransformMakeTranslation(- scrollView.contentOffset.x, 0);
    self.bottomView.transform = CGAffineTransformMakeTranslation(- scrollView.contentOffset.x, 0);
    self.yiLouView.transform = CGAffineTransformMakeTranslation(- scrollView.contentOffset.x, 0);
    self.maxYiLouView.transform = CGAffineTransformMakeTranslation(- scrollView.contentOffset.x, 0);
    self.maxLianChuView.transform = CGAffineTransformMakeTranslation(- scrollView.contentOffset.x, 0);
}

/*
*奖期属性直接是从数组中取出奖期数据,加载,这里不在描述,主要描述绘制开奖结果的问题
*/
#pragma mark -- 获取到上层开奖结果数据
- (instancetype)initWithNumberArray:(NSArray *)numberArray {
    if (self = [super init]) {
        self.numberArray = numberArray;
        self.backgroundColor = [UIColor whiteColor];
        self.pointArray = [NSMutableArray array];
    }
    return self;
}
#pragma mark -- 使用上层数组数据绘制图形
- (void)drawRect:(CGRect)rect 
{
     //获取上下文方法
    CGContextRef context = UIGraphicsGetCurrentContext();
    //数字的个数
    NSInteger listCount = [[self.numberArray[index] objectForKey:@"number"] count];

    for (NSDictionary *dic in self.numberArray) {
        //设置背景颜色
        index % 2 == 0 ? CGContextSetRGBFillColor(context, 240 / 255.0, 240 / 255.0, 240 / 255.0, 1) : CGContextSetRGBFillColor(context, 255 / 255.0, 255 / 255.0, 255 / 255.0, 1);
        CGContextFillRect(context, CGRectMake(0,index * kItemWidth,listCount * (kItemWidth + 1),kItemWidth));
        NSInteger numbIndex = 0;
        NSInteger selectIndex = 0;
        //绘制文字以及图片
        NSArray *numberArr = [dic objectForKey:@"number"];
        NSArray *awardArray = [dic objectForKey:@"award"];
        NSArray *blueawardArray = [dic objectForKey:@"blueaward"];//如果是大乐透会有后区蓝球加载
        self.lotteryId = [[dic objectForKey:@"lotteryId"] intValue];//根据每个彩种id来判断
        NSInteger ballFlag = [[dic objectForKey:@"ballFlag"] integerValue];//获取到每个点击的数值,主要对双色球和大乐透来判断1为红球,2为蓝球,如果是七乐彩(蓝球为特殊号码,并且和红球绘制在一起)
        if (self.lotteryId == 10033) {//七乐彩加载蓝球
                    for ( int i = 0 ; i < blueawardArray.count; i ++) {
                        NSString *blueBall = [blueawardArray objectAtIndex:i];
                        if ([blueBall integerValue] == [numStr integerValue]) {
                            [RGB(0, 160, 255, 1) set];
                            CGContextFillEllipseInRect(context, CGRectMake(numbIndex * kItemWidth + 1 * numbIndex + 2.5,index * kItemWidth + 2.5, kItemWidth - 5, kItemWidth - 5));
                            NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init];
                            para.alignment = NSTextAlignmentCenter;
                            [numStr drawInRect:CGRectMake(numbIndex * kItemWidth + 1 * numbIndex,7 + index * kItemWidth,kItemWidth,kItemWidth)
                                withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14], NSForegroundColorAttributeName: [UIColor whiteColor], NSParagraphStyleAttributeName : para}];
                        }
                    }
                }
        if (!([numStr integerValue] == [awardArray[selectIndex] integerValue])) {
                    NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init];
                    para.alignment = NSTextAlignmentCenter;
                    
                }else {
                    [RGB(230, 47, 23, 1) set];
                    CGContextFillEllipseInRect(context, CGRectMake(numbIndex * kItemWidth + 1 * numbIndex + 2.5,index * kItemWidth + 2.5, kItemWidth - 5, kItemWidth - 5));
                    NSMutableParagraphStyle *para = [[NSMutableParagraphStyle alloc] init];
                    para.alignment = NSTextAlignmentCenter;
                    [numStr drawInRect:CGRectMake(numbIndex * kItemWidth + 1 * numbIndex,7 + index * kItemWidth,kItemWidth,kItemWidth)
                        withAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14], NSForegroundColorAttributeName: [UIColor whiteColor], NSParagraphStyleAttributeName : para}];
                    
                    if (self.lotteryId == 10026) { //福彩3d
                        if (selectIndex < 4) { //根据开奖的结果得到福彩3D的前区号码
                            selectIndex ++;
                        }
                    }
                    if (self.lotteryId == 10032) { // 双色球
                        if (selectIndex < 5) {//双色球红球号码(蓝球绘制时候需要绘制连线、由于我是先绘制的蓝球,后绘制的线条,导致线条遮挡了蓝球上面的数字,暂时还未解决,)
                            selectIndex ++;
                        }
                    }
      }
          CGContextSetRGBStrokeColor(context, 210 / 255.0, 210 / 255.0, 210 / 255.0, 1);//线条颜色
          for (NSInteger i = 0; i < listCount; i++) {
             //画期数竖着的线线条
             CGContextMoveToPoint(context,kItemWidth + i * kItemWidth + 1 * i, 0);
             CGContextAddLineToPoint(context,kItemWidth + i * kItemWidth + 1 * i, self.numberArray.count * kItemWidth);
             }
     }
           CGContextStrokePath(context);

}
/*
* 以上就是绘制线条和相关红球的代码,有时间我会缕缕,拿出这段代码改成demo放在github,期待大家star,虽然有点乱,但是主要代码是OK的,一起加油!!!至于最下面的(最大连出、最大遗漏、平均遗漏、平均遗漏对于label来说so easy了,可能效率上和drawRect相比还是有差距的)
*/

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

推荐阅读更多精彩内容