前两天一哥们儿让我帮他写一下:可循环滚动并突出中间图片,并且可点击的一种滑动视图的效果,今天放在这里给大家展示一下,具体文字代码中都有注解,代码还有待完善,不喜勿喷,转载请注明,下载请点星,谢谢~

-(void)addItemViewWithArray:(NSArray *)imgArr titleArray:(NSArray *)titleArr
{
    //这里因为我要保证屏幕上至少能够出现三个完整的,两边两个部分内容,所以我写了4
    if (_imgArray.count<4) {
        return;
    }
    //设计item大小,中间比两边的宽、高各大30,间距为10,距离左右边界为30
    itemWidthF = (_frameE.size.width-30*2-30-20)/3;
    itemHeightF = _frameE.size.height-30;
    bigItemWidthF = itemWidthF+30;
    bigItemHeightF = itemHeightF+30;
    
    //中心值
    xCenterF = _frameE.size.width/2.0;
    
    //创建新的数组
    NSMutableArray *newImgArr = [NSMutableArray new];
    NSMutableArray *newTitleArr = [NSMutableArray new];
    for (int i = 0; i < imgArr.count+4; i++) {
        if (i < 2) {//0,1
            [newImgArr addObject:imgArr[imgArr.count+i-2]];
            [newTitleArr addObject:titleArr[titleArr.count+i-2]];
        }else if(i >= 2 && i < imgArr.count+2){//2,3,.....(imgArr.count-1)
            [newImgArr addObject:imgArr[i-2]];
            [newTitleArr addObject:titleArr[i-2]];
        }else{
            [newImgArr addObject:imgArr[i-imgArr.count-2]];
            [newTitleArr addObject:titleArr[i-imgArr.count-2]];
        }
    }
    
    //记录数组数量
    NSInteger totalNum = newImgArr.count;
    for (int i = 0; i < totalNum; i++) {
        
        UIButton *bgBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [bgBtn setTitle:newTitleArr[i] forState:UIControlStateNormal];
        [bgBtn setBackgroundColor:[UIColor blueColor]];
        bgBtn.layer.cornerRadius = 5;
        bgBtn.layer.borderColor = [UIColor lightGrayColor].CGColor;
        bgBtn.layer.borderWidth = 1.0;
        [bgBtn setBackgroundImageForState:UIControlStateNormal withURL:[NSURL URLWithString:newImgArr[i]] placeholderImage:[UIImage imageNamed:@""]];
        [bgBtn addTarget:self action:@selector(bgBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        bgBtn.userInteractionEnabled = NO;
        if (i == 2) {
            bgBtn.frame = CGRectMake(30+(itemWidthF+10)*i, 0, bigItemWidthF, bigItemHeightF);
            bgBtn.userInteractionEnabled = YES;
            
            [_bgScrollV setContentOffset:CGPointMake(((30+(itemWidthF+10)*i)+bigItemWidthF/2)-xCenterF, 0) animated:YES];
            
            _currentInt = i;
            
        }else if(i>2){
            bgBtn.frame = CGRectMake(30+(itemWidthF+10)*i+30, 15, itemWidthF, itemHeightF);
        }else{
            bgBtn.frame = CGRectMake(30+(itemWidthF+10)*i, 15, itemWidthF, itemHeightF);
        }
        
        bgBtn.tag = i+100;
        
        [_bgScrollV addSubview:bgBtn];
        
    }
    _bgScrollV.contentSize = CGSizeMake((itemWidthF+10)*totalNum+30+30*2, bigItemHeightF);
    
    [self addgesture];
}

//手势方法
-(void)transitionPush:(UISwipeGestureRecognizer *)swipeGes
{
    [UIView animateWithDuration:0.2 animations:^{
        UIButton *oldBtn = (UIButton *)[_bgScrollV viewWithTag:_currentInt+100];
        //取消旧按钮的交互
        oldBtn.userInteractionEnabled = NO;
        //NSLog(@"输出1111--------%ld",_currentInt);
        if (swipeGes.direction == UISwipeGestureRecognizerDirectionLeft){
            if (_currentInt==_imgArray.count+2-1) {
                NSLog(@"已经是最后一张了....");
                
                //回到最原始的位置,记录的是数组中的索引值
                _currentInt = 2;
                
                //变大的后面的按钮到最后一个的位置都变小
                for (int i = 3; i<_imgArray.count+2; i++) {
                    UIButton *allOldBtn = (UIButton *)[_bgScrollV viewWithTag:i+100];
                    allOldBtn.frame = CGRectMake(30+(itemWidthF+10)*i+30, 15, itemWidthF, itemHeightF);
                }
            }else{
                
                _currentInt = _currentInt+1;
                
                //旧的按钮变小,比下面的差了30的距离
                oldBtn.frame = CGRectMake(30+(itemWidthF+10)*(_currentInt-1), 15, itemWidthF, itemHeightF);
            }
            
        }
        if(swipeGes.direction == UISwipeGestureRecognizerDirectionRight){
            if (_currentInt==2) {
                NSLog(@"已经是第一张了....");
                
                //回到最后的位置,记录的是数组中的索引值
                _currentInt = _imgArray.count+2-1;
                
                //变大的后面的按钮到_currentInt==2的位置都变小
                for (int i = 2; i<_imgArray.count+2-1; i++) {
                    UIButton *allOldBtn = (UIButton *)[_bgScrollV viewWithTag:i+100];
                    allOldBtn.frame = CGRectMake(30+(itemWidthF+10)*i, 15, itemWidthF, itemHeightF);
                }
            }else{
                _currentInt = _currentInt-1;
                
                //旧的按钮变小
                oldBtn.frame = CGRectMake(30+(itemWidthF+10)*(_currentInt+1)+30, 15, itemWidthF, itemHeightF);
            }
        }
        
        //新的变大
        UIButton *newBtn = (UIButton *)[_bgScrollV viewWithTag:_currentInt+100];
        newBtn.frame = CGRectMake(30+(itemWidthF+10)*_currentInt, 0, bigItemWidthF, bigItemHeightF);
        //添加新按钮的交互
        newBtn.userInteractionEnabled = YES;
        
        [_bgScrollV setContentOffset:CGPointMake(((30+(itemWidthF+10)*_currentInt)+bigItemWidthF/2)-xCenterF, 0) animated:YES];
        
        //NSLog(@"输出2222--------%ld",_currentInt);
    }];
}

效果图:(源码下载:https://github.com/hbblzjy/OCSelectImgDemo)

      

OC基础之可循环滚动并突出中间图片,并且可点击的更多相关文章

  1. 【OC基础语法考试】

    OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...

  2. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  3. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  4. OC基础 文件管理

    OC基础  文件管理 1.文件管理类NSFileManager对象的创建: NSFileManager *fm = [NSFileManager defaultManager]; 2.文件操作: (1 ...

  5. OC基础 NSDate

    OC基础  NSDate #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @auto ...

  6. OC基础 NSData

    OC基础 NSData 1.NSString转NSData //NSString转NSData NSString *string = @"abcd12345"; NSData *d ...

  7. OC基础 代理和协议

    OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...

  8. OC基础 内存管理

    OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...

  9. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

随机推荐

  1. Http读书笔记1-5章

    第一章 内容提要 这一章主要介绍了什么是http以及http是干嘛的,以及与之有关的相关概念,当然了这些概念都是概览式的介绍一些.所以我将采用问答式的方式描述这一章! Q:http是干嘛的? A:ht ...

  2. SSM(Spring)中,在工具类中调用服务层的方法

    因为平时在调用service层时都是在controller中,有配置扫描注入,spring会根据配置自动注入所依赖的服务层. 但因我们写的工具类不属于controller层,所以当所写接口需要调用服务 ...

  3. 树莓派(1)- Raspberry Pi 3B 安装系统并联网

    一.背景 昨天到手淘宝买的3B,既然买了就不能让它吃灰,动起来. 二.物料 名称 说明 硬件  树莓派3B 主体 树莓派电源 5V 2A sd卡 4G低速(推荐是16G class10),我手头只有这 ...

  4. Android系统框架构

    写此本文是为了对Android系统框架有一个整体的认识和了解,对于开发和测试人员脑子里要有整体认识以便对工作有所帮助. 进入正题 首先Android系统架构采用了分层架构的思想,共分为四层由上到下分: ...

  5. [LeetCode] 1-bit and 2-bit Characters 一位和两位字符

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  6. [SCOI2009]windy数

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输 ...

  7. bzoj 3631: [JLOI2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  8. linux办公软件的使用和病毒防范

    今天看了linux办公软件的使用和病毒防范,特做此记录,将不熟悉的内容总结一下: openoffice 和liberoffice是可以跨平台的两款办公软件.odt是openoffice的扩展名.lib ...

  9. Cloud TPU Demos(TensorFlow 云 TPU 样例代码)

    Cloud TPU Demos 这是一个Python脚本的集合,适合在开源TensorFlow和 Cloud TPU 上运行. 如果您想对模型做出任何修改或改进,请提交一个 PR ! https:// ...

  10. h5的input的required使用中遇到的问题

    form提交时隐藏input发生的错误 问题描述 在form表单提交的时候,有些input标签被隐藏,表单验证过程中会出现An invalid form control with name='' is ...