上图看效果先:

1)画座位图其实不是很难一般数据都会给坐标,将坐标对应座位画出来就可以了,主要是开场动画要设置默认大小,还有座位图的数量也不是固定的,所以在初始化座位图的时侯就默认算出了整个座位图的大小

-(instancetype)initWithSeatsArray:(NSMutableArray *)seatsArray maxNomarWidth:(CGFloat)maxW seatBtnActionBlock:(void (^)(id))actionBlock{          
   if (self = [super init]) {                  
       self.actionBlock = actionBlock;                  
       ZFSeatsModel *seatsModel = seatsArray.firstObject;        
                NSUInteger cloCount = [seatsModel.columns count];                  
                if (cloCount % 2) cloCount += 1;//偶数列数加1 防止中线压住座位                  
                CGFloat seatViewW = maxW - 2 * ZFseastsRowMargin;                  
                CGFloat seatBtnW = seatViewW / cloCount;                  
                if (seatBtnW > ZFseastMinW_H) {            
                    seatBtnW = ZFseastMinW_H;            
                    seatViewW = cloCount * ZFseastMinW_H;        
                }        
                //初始化就回调算出按钮和自身的宽高        
                CGFloat seatBtnH = seatBtnW;        
                self.seatBtnWidth = seatBtnW;        
                self.seatBtnHeight = seatBtnH;        
                self.seatViewWidth = seatViewW;        
                self.seatViewHeight = [seatsArray count] * seatBtnH;        
                //初始化座位        
                [self initSeatBtns:seatsArray];    
            }    
            return self;
        }

2)画侧边的索引条 主要就是算出总共有多少列,有没走到之类的 将座位列号根据每个竖向坐标直接画进索引条就可以了

//画索引条
- (void)drawRect:(CGRect)rect {          
   NSDictionary *attributeName = @{NSFontAttributeName: [UIFont systemFontOfSize:10],NSForegroundColorAttributeName : [UIColor whiteColor]};    
        CGFloat NuomberTitleH = (self.height - 2 * 10) / self.indexsArray.count;          
        [self.indexsArray enumerateObjectsUsingBlock:^(ZFSeatsModel *seatsModel, NSUInteger idx, BOOL *stop) {                      
                CGSize strsize =  [seatsModel.rowId sizeWithAttributes:attributeName];            
                [seatsModel.rowId drawAtPoint:CGPointMake(self.width * 0.5 - strsize.width  * 0.5,10 + idx * NuomberTitleH + NuomberTitleH  * 0.5 - strsize.height  * 0.5) withAttributes:attributeName];              
          }];
    }

3)中线启示也是自定义一个view画一条线线上是label,每次随座位图上下滚动,重新设置自身高度重绘该线条就能达到效果

-(void)setHeight:(CGFloat)height{          
   [super setHeight:height];    
        [self setNeedsDisplay];
    }
    - (void)drawRect:(CGRect)rect {          
        CGContextRef context = UIGraphicsGetCurrentContext();    
        CGContextSetLineWidth(context, 1.0);    
        CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);    
        CGFloat lengths[] = {6,3};    
        CGContextSetLineDash(context, 0, lengths,2);    
        CGContextMoveToPoint(context, 0, 0);    
        CGContextAddLineToPoint(context, 0, self.bounds.size.height);    
        CGContextStrokePath(context);
    }

4)每次座位图滚动的时候随着偏移量的变化更新其他所有控件的坐标就能达到某一方向跟随scrollview滚动方向移动

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{    
   // 更新applogo    
   if (scrollView.contentOffset.y <= scrollView.contentSize.height - self.height +ZFseastsColMargin + 15) {        
       self.maoyanLogo.y = CGRectGetMaxY(self.seatView.frame) + 35;        
       self.maoyanLogo.centerX = self.seatView.centerX;    
   }else{        
       self.maoyanLogo.centerX = self.seatView.centerX;        
       self.maoyanLogo.y = scrollView.contentOffset.y + self.height - self.maoyanLogo.height;    
   }    
   //更新hallLogo    
   self.hallLogo.y = scrollView.contentOffset.y;          
   //更新中线    
   self.centerLine.height = CGRectGetMaxY(self.seatView.frame) + 2 * ZFSmallMargin;          
   if (scrollView.contentOffset.y < - ZFseastsColMargin ) {        
       self.centerLine.y = self.seatView.y - ZFseastsColMargin + ZFCenterLineY;    
   }else{        
       self.centerLine.y = scrollView.contentOffset.y + ZFCenterLineY;        
       self.centerLine.height = CGRectGetMaxY(self.seatView.frame) - scrollView.contentOffset.y - 2 * ZFCenterLineY + ZFseastsColMargin;    
   }    
   // 更新索引条    
   self.rowindexView.x = scrollView.contentOffset.x + ZFseastMinW_H;              
   //更新indicator大小位置    
   [self.indicator updateMiniIndicator];    
   if (!self.indicator.hidden || self.seatScrollView.isZoomBouncing)return;    
   self.indicator.alpha = 1;    
   self.indicator.hidden = NO;      
}

最后不多解释啦上Github地址:https://github.com/ZFbaby/ZFSeatsSelection/blob/master/ZFSeatsSelection

原文地址:http://www.cocoachina.com/ios/20160812/17347.html

高仿猫眼电影选座(选票)模块-b的更多相关文章

  1. android:自己定义组合控件Weight(高仿猫眼底部菜单条)

    在我们实际开发其中.会碰见一些布局结构类似或者同样的界面.比如应用的设置界面.tabbutton界面等. 这时候.对于刚開始学习的人来说,xml里面一个个绘制出来也许是最初的想法.可能随着经验的积累, ...

  2. android 自定义view之选座功能

    效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手指缩放时跟随缩放 主要技术点 ...

  3. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  4. 模仿猫眼电影App一个动画效果

    看真正的猫眼效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzIxMDYyMA==/font/5a6L5L2T/fontsize/400/f ...

  5. 自己定义ViewpagerIndicator (仿猫眼,加入边缘回弹滚动效果)

    一.概述 今天主要来分享个自己定义viewpagerindicator.效果主要是仿 猫眼电影 顶部的栏目切换.也就是我们常说的indicator,难度简单,为了让滑动时效果更炫酷,我在滑动到左边第一 ...

  6. iOS开发之功能模块--高仿Boss直聘的常用语的开发

    首先上Boss直聘的功能界面截图,至于交互请读者现在Boss直聘去交互体验:     本人的公司项目要高仿Boss直聘的IM常用语的交互功能,居然花费了我前后17个小时完成,这回自己测试了很多遍,代码 ...

  7. android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

    先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信 ...

  8. Qt编写高仿苹果MAC电脑输入法(支持触摸滑动选词)

    最近有个朋友找我定制一个输入法,需要高仿一个苹果MAC电脑的输入法,MAC操作系统的审美无疑是相当棒的,于是乎直接拿以前的输入法高仿了一个,由于之前有做过输入法这块的开发,而且改进了四年,各种需求都遇 ...

  9. 【饿了么】—— Vue2.0高仿饿了么核心模块&移动端Web App项目爬坑(三)

    前言:接着上一篇项目总结,这一篇是学习过程记录的最后一篇,这里会梳理:评论组件.商家组件.优化.打包.相关资料链接.项目github地址:https://github.com/66Web/ljq_el ...

随机推荐

  1. [改善Java代码] 枚举项数量限定为64个以内

    建议89:枚举项的数量限制在64个以内 为了更好的使用枚举,java 提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,E ...

  2. 关于JDK中的运算符和变量

    类名首字母必须大写.多个单词组成的类名,每个单词的首字母大写. 只要起名称就要让他有意义.Java中的关键字都是由小写字母组成的. 在项目中给标示符起名字在公司中大都有固定的规则.一般加上标示符和$符 ...

  3. [未完成][Mooc]关于IO总结

    整个课程的大纲:1.编码问题.2.File类的使用3.RandomAccessFile的使用4.字节流的使用.5.字符流的使用.6.对象的序列化和反序列化. 视频1:文件的编码Eclipse的一大特点 ...

  4. Scala中的偏函数与部分应用函数

    Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部 ...

  5. Java事件总线

    在平时写代码的过程中,我们需要实现这样一种功能:当执行某个逻辑时,希望能够进行其他逻辑的处理.最粗暴的方法是直接依赖其他模块,调用该模块的相应函数或者方法.但是,这样做带来一些问题. 模块间相互依赖, ...

  6. windows 端搭建nfs 服务器

    因为最近虚拟机桥连模式总是用不了会出问题,所以今天花了半个小时研究了一下在Windows主机下搭建一个nfs服务器进行文件传输. 其实步骤很简单,如下: 1. 下载NFS Windows服务器软件,我 ...

  7. MyBatis(3.2.3) - Handling enumeration types

    MyBatis supports persisting enum type properties out of the box. Assume that the STUDENTS table has ...

  8. Delphi IP 控件源码

    interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ComCtrls, Co ...

  9. selenium Grid(一)

    selenium grid Quick Start selenium-grid是用于设计帮助我们进行分布式测试的工具,其整个结构是由一个hub节点和若干个代理节点组成.hub用来管理各个代理节点的注册 ...

  10. ios开发:代理设计模式

    代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象去做和实现一些东西. 主对象维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息,这个消息通知“代理”对 ...