• collectionViewFlow的界面编写


    #import <UIKit/UIKit.h>
    
    //这边我们会创建一个scrollView的界面,这个scrollView里面有三张图片构成,我们使用下面的枚举方式来定义这三个位置
    typedef NS_ENUM(NSInteger, MRImgLocation) {
        MRImgLocationLeft,
        MRImgLocationCenter,
        MRImgLocationRight,
    };
    
    
    @interface MRimgView : UIScrollView <UIScrollViewDelegate>
    {
        NSDictionary* _imgViewDic;   // 这个字典里面存放了scrollView的图片,一共三个图片
    }
    
    @property(nonatomic ,retain)NSMutableArray *imgSource;
    @property(nonatomic ,assign)NSInteger curIndex;     // 当前显示图片在数据源中的下标
    
    - (id)initWithFrame:(CGRect)frame withSourceData:(NSMutableArray *)imgSource withIndex:(NSInteger)index;
    
    // 谦让双击放大手势
    - (void)requireDoubleGestureRecognizer:(UITapGestureRecognizer *)tep;
    
    @end

    这边通过一个实际例子来介绍collectionViewFlow。下面是完成这个collectionViewFlow的文件:


    介绍这些文件的作用:

    首先第一个collectionView文件,在此文件中创建一个collectionViewFlow的瀑布流图片。

    然后第二个imgViewController文件,在此文件中创建一个viewController界面,和普通的viewController界面没有什么区别。

    最后第三个MRimgView文件,在此文件中创建一个scrollView界面,我们在这里可以图片的放大操作和滑动观看操作。

    以上文件的链接过程:首先我们点击进入瀑布流图片界面(collectionView文件),然后我们点击一个图片的滚动视图界面(在imgViewController文件的界面上添加了一个MRimgView的滚动视图界面),就这样完成了瀑布流图片的界面。


    下面来对这些文件进行一一介绍:

    首先我们来介绍collectionView文件:

    //**********************collectionView.h*************************//

    #import <UIKit/UIKit.h>
    
    @interface collectionView : UIViewController<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>
    //这里我们遵循了三个协议,这三个协议分别是collection的数据源,委托和自动布局协议
    
    @property (nonatomic, strong) NSMutableArray *DataImage;//储存图片信息
    
    @end

    //**********************collectionView.m*************************//

    #import "collectionView.h"
    #import "imgViewController.h"
    
    //我们要在这个界面上调用这个文件,在navigation中push一个imgviewController文件
    
    @interface collectionView ()
    {
        NSString *_identify;
    //    用于创建collectionView的cell
    }
    
    @end
    
    @implementation collectionView
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        self.title = @"图片列表";
        [self _requestData];
        [self _init];
        self.navigationController.navigationBarHidden = YES;
    }
    
    -(void) _requestData
    {
        //     请求数据,储存图片
        self.DataImage = [[NSMutableArray alloc] init];
        
        for (int i = 0; i < 12; i++) {
            NSString *imgName = [NSString stringWithFormat:@"%d.jpg",i];
            UIImage *img = [UIImage imageNamed:imgName];
            [self.DataImage addObject:img];
        }
    }
    
    -(void) _init
    {
        //    首先我们创建布局对象
        UICollectionViewFlowLayout *viewLayout = [[UICollectionViewFlowLayout alloc] init];
        viewLayout.itemSize = CGSizeMake(100, 150);
        viewLayout.minimumLineSpacing = 6;//设置每行之间的最小间距
        viewLayout.minimumInteritemSpacing = 6;//设置每行中的图片的最小间距
        
        //    设置我们的集合视图流
        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(3, 3, self.view.frame.size.width - 6, self.view.frame.size.height - 80) collectionViewLayout:viewLayout];
        collectionView.dataSource = self;
        collectionView.delegate = self;
        collectionView.backgroundColor = [UIColor clearColor];
        
        //为该cellectionView实例注册单元格
        _identify = @"PhotoCell";
        [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:_identify];
        
    //    将刚刚创建的collectionView添加到界面上
        [self.view addSubview:collectionView];
        
    //    添加navigationBar的左箭头
        //    自定义按钮barLeft
        UIButton *actionBtnlf = [UIButton buttonWithType:UIButtonTypeCustom];
        [actionBtnlf setTitle:@"" forState:UIControlStateNormal];
        UIImage *imgDefault = [UIImage imageNamed:@"Arrow"];
        [actionBtnlf setFrame:CGRectMake(0, 0, imgDefault.size.width, imgDefault.size.height)];
        [actionBtnlf setBackgroundImage:imgDefault forState:UIControlStateNormal];
        [actionBtnlf addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:actionBtnlf];
    }
    
    //下面实现我们collectionView里面的delegate和datasource里面的方法
    -(NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    {
        //    返回每一个section里面的试图的数量,这边我们就只有一个section
        return self.DataImage.count;
    }
    
    -(UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        //    创建我们的cell,并且返回cell到的集合试图的相应位置
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:_identify forIndexPath:indexPath];
        cell.backgroundColor = [UIColor clearColor];
        UIImage *image = self.DataImage[indexPath.row];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        imageView.contentMode = UIViewContentModeScaleToFill;
        
        imageView.frame = CGRectMake(0, 0, 100, 150);
        
        [cell.contentView addSubview:imageView];
        
        return cell;
    }
    
    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
        //    点击相应的视图的时候,我们将调用这个方法
        // 深拷贝数据
        NSMutableArray *imgList = [NSMutableArray arrayWithCapacity:self.DataImage.count];
        for (int i = 0; i < self.DataImage.count; i++) {
            UIImage *imgMod = self.DataImage[i];
            [imgList addObject:imgMod];
        }
        // 调用展示窗口,这边调用的这个方法是imgViewController借口文件中的方法
        imgViewController *imgView = [[imgViewController alloc] initWithSourceData:imgList withIndex:indexPath.row];
        [self.navigationController pushViewController:imgView animated:YES];
    }
    
    #pragma mark -View生命周期
    - (void)viewWillAppear:(BOOL)animated{
    //    每当这个视图出现的时候,这个函数都会被调用
        if (self.navigationController.navigationBar.translucent) {
            self.navigationController.navigationBar.translucent = NO;
        }
        if (self.navigationController.navigationBarHidden) {
            self.navigationController.navigationBarHidden = NO;
        }
    }
    
    -(void) backButtonAction
    {
        [self.navigationController popViewControllerAnimated:YES];
        self.navigationController.navigationBarHidden = YES;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    下面是imgViewController文件

    //**********************imgcollectionView.h*************************//

    #import <UIKit/UIKit.h>
    
    @interface imgViewController : UIViewController
    
    @property (strong, nonatomic) NSMutableArray *data;//储存数据
    @property (nonatomic, assign) NSInteger index;//储存点击的图片的位置
    
    - (id)initWithSourceData:(NSMutableArray *)data withIndex:(NSInteger)index;
    
    @end

    //**********************imgcollectionView.m*************************//

    #import "imgViewController.h"
    #import "MRimgView.h"
    //我们在这里要加载一个MRimgview中的scrollView的文件
    
    @interface imgViewController ()
    
    @end
    
    @implementation imgViewController
    - (id)initWithSourceData:(NSMutableArray *)data withIndex:(NSInteger)index{
        
        self = [super init];
        if (self) {
            _data = data;
            _index = index;
        }
        return self;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
        
        self.title = @"图片列表";
        //设置导航栏为半透明
        self.navigationController.navigationBar.translucent = YES;
        // 隐藏标签栏
        self.tabBarController.tabBar.hidden = YES;
        // 隐藏导航栏
        self.navigationController.navigationBarHidden = YES;
        
    //    这里我们创建一个手势,点击View一下,此事件触发
        UITapGestureRecognizer *tapGestureOne = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureOneAction)];
        tapGestureOne.numberOfTapsRequired = 1;
        [self.view addGestureRecognizer:tapGestureOne];
        
        self.automaticallyAdjustsScrollViewInsets = NO;
        [self.view setBackgroundColor:[UIColor blackColor]];
        
        //    添加navigationBar的左箭头
        //    自定义按钮barLeft
        UIButton *actionBtnlf = [UIButton buttonWithType:UIButtonTypeCustom];
        [actionBtnlf setTitle:@"" forState:UIControlStateNormal];
        UIImage *imgDefault = [UIImage imageNamed:@"Arrow"];
        [actionBtnlf setFrame:CGRectMake(0, 0, imgDefault.size.width, imgDefault.size.height)];
        [actionBtnlf setBackgroundImage:imgDefault forState:UIControlStateNormal];
        [actionBtnlf addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:actionBtnlf];
        //    为这个视图添加图片
        [self creatImgShow];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(void) creatImgShow
    {
        //    为视图添加图片
        MRimgView *imgShowView = [[MRimgView alloc]
                                  initWithFrame:self.view.frame
                                  withSourceData:_data
                                  withIndex:_index];
    //谦让双击方法事件
        [imgShowView requireDoubleGestureRecognizer:[[self.view gestureRecognizers] lastObject]];
        
        [self.view addSubview:imgShowView];
    }
    -(void) tapGestureOneAction
    {
        //    点按视图一下,启动的action,隐藏导航栏或者出现导航栏
        [UIView animateWithDuration:0.3 animations:^{
            self.navigationController.navigationBarHidden = !self.navigationController.navigationBarHidden;
        }];
    }
    
    -(void) backButtonAction
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    /*
     #pragma mark - Navigation
     
     // In a storyboard-based application, you will often want to do a little preparation before navigation
     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     // Get the new view controller using [segue destinationViewController].
     // Pass the selected object to the new view controller.
     }
     */
    
    @end

    //**********************MRimgView.h*************************//

    #import <UIKit/UIKit.h>
    
    //这边我们会创建一个scrollView的界面,这个scrollView里面有三张图片构成,我们使用下面的枚举方式来定义这三个位置
    typedef NS_ENUM(NSInteger, MRImgLocation) {
        MRImgLocationLeft,
        MRImgLocationCenter,
        MRImgLocationRight,
    };
    
    
    @interface MRimgView : UIScrollView <UIScrollViewDelegate>
    {
        NSDictionary* _imgViewDic;   // 这个字典里面存放了scrollView的图片,一共三个图片
    }
    
    @property(nonatomic ,retain)NSMutableArray *imgSource;
    @property(nonatomic ,assign)NSInteger curIndex;     // 当前显示图片在数据源中的下标
    
    - (id)initWithFrame:(CGRect)frame withSourceData:(NSMutableArray *)imgSource withIndex:(NSInteger)index;
    
    // 谦让双击放大手势
    - (void)requireDoubleGestureRecognizer:(UITapGestureRecognizer *)tep;
    
    @end

    //**********************MRimgView.m*************************//

    #import "MRimgView.h"
    
    #define kImgViewCount 3
    #define kImgZoomScaleMin 1
    #define kImgZoomScaleMax 3
    
    @implementation MRimgView
    {
        UIScrollView *_scrCenter;
    }
    
    - (id)initWithFrame:(CGRect)frame withSourceData:(NSMutableArray *)imgSource withIndex:(NSInteger)index
    {
        //    将我们的image传入这个类,然后将图片位置传入类中,还有这个图片的大小
        self = [super initWithFrame:frame];
        
        if (self) {
            //        初始化空间属性
            [self initScroller];
            
            //        设置数据源的操作
            [self setImgSource:imgSource];
            
            //        设置图片下标
            [self setCurIndex:index];
        }
        return self;
    }
    
    -(void) initScroller
    {
        //    初始化self的scrollerView控件属性
        self.delegate = self;
        self.showsHorizontalScrollIndicator = NO;
        self.showsVerticalScrollIndicator = NO;
        self.pagingEnabled = YES;
        self.backgroundColor = [UIColor clearColor];
        
        // 构建展示组
        [self initImgViewDic];
    }
    
    - (void)setImgSource:(NSMutableArray *)imgSource
    {
        //    这边我们进行数据的插入操作
        if (_imgSource != imgSource) {
            _imgSource = imgSource;
            
            //  设置展示板尺寸
            [self setConSize];
        }
        
    }
    
    // 展示板尺寸设置
    - (void)setConSize{
        
        CGSize size = self.frame.size;
        
        //设置内容视图的大小--单页填充、横向划动
        self.contentSize = CGSizeMake(size.width * kImgViewCount, size.height);
        
        // 设置显示页 这句话的作用是设置了滚动视图现实在屏幕上的区域,距离坐标原点的向量是(320,0),因此把scrCenter显示在屏幕上
        [self setContentOffset:CGPointMake(size.width, 0)];
    }
    
    // 初始化展示板组
    -(void) initImgViewDic
    {
        UIImageView *imgLeft = [self creatImageView];
        UIImageView *imgCenter = [self creatImageView];
        UIImageView *imgRight = [self creatImageView];
        
        _imgViewDic = [[NSDictionary alloc] initWithObjectsAndKeys:
                       imgLeft, @"imgLeft",
                       imgCenter, @"imgCenter",
                       imgRight, @"imgRight",
                       nil];
        
        //    创建滚动视图
        UIScrollView *scrLeft =
        [self scrollViewWithPosition:MRImgLocationLeft withImgView:imgLeft];
        _scrCenter =
        [self scrollViewWithPosition:MRImgLocationCenter withImgView:imgCenter];
        UIScrollView *scrRight =
        [self scrollViewWithPosition:MRImgLocationRight withImgView:imgRight];
        
        //设置放大缩小极限倍数
        _scrCenter.maximumZoomScale = kImgZoomScaleMax;
        _scrCenter.minimumZoomScale = kImgZoomScaleMin;
        
        _scrCenter.delegate = self;
        
        // 添加双击手势
        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapClick:)];
        doubleTap.numberOfTapsRequired = 2;
        
        [self addGestureRecognizer:doubleTap];
        
        // 放入展示板
        [self addSubview:scrLeft];
        [self addSubview:_scrCenter];
        [self addSubview:scrRight];
    }
    
    // 通过创建展示板
    - (UIImageView *)creatImageView{
        
        CGFloat width = self.frame.size.width;
        CGFloat height = self.frame.size.height;
        
        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
        
        return imgView;
    }
    
    - (UIScrollView *)scrollViewWithPosition:(MRImgLocation)imgLocation withImgView:(UIImageView *)imgView
    {
        //    创建滚动视图
        CGFloat width = self.frame.size.width;
        CGFloat height= self.frame.size.height;
        
        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(width * imgLocation, 0, width, height)];
        scrollView.backgroundColor = [UIColor blackColor];
        
        [scrollView addSubview:imgView];
        
        // 设置图片显示样式
        imgView.contentMode = UIViewContentModeScaleAspectFit;
        
        return scrollView;
    }
    
    - (void)setCurIndex:(NSInteger)curIndex
    {
        //    设置图片内容
        //第2、3个if是为了设置循环滚动
        if (_imgSource.count > curIndex && curIndex >= 0) {
            _curIndex = curIndex;
        } else if (curIndex == -1){
            _curIndex = _imgSource.count - 1;
        } else if (curIndex == _imgSource.count){
            _curIndex = 0;
        }
        
        if (_imgSource.count)
        {[self setAllImgVContentFromImage:[self imgListFromIndex:_curIndex]];}
    }
    
    // 载入一组图片
    - (void)setAllImgVContentFromImage:(NSArray *)imgList{
        
        // 将所有imgList中的数据载入展示板
        UIImageView *vLift = [_imgViewDic valueForKey:@"imgLeft"];
        UIImageView *vCenter = [_imgViewDic valueForKey:@"imgCenter"];
        UIImageView *vRight = [_imgViewDic valueForKey:@"imgRight"];
        
        [vLift setImage:imgList[MRImgLocationLeft]];
        [vCenter setImage:imgList[MRImgLocationCenter]];
        [vRight setImage:imgList[MRImgLocationRight]];
    }
    
    // 根据当前索引赋值图片   该方法返回一个存有左中右3个image的数组
    - (NSArray *)imgListFromIndex:(NSInteger)curIndex{
        
        long sCount = _imgSource.count;
        NSArray *imgList;
        
        UIImage *imgL;
        UIImage *imgC;
        UIImage *imgR;
        
        if (sCount) {
            
            // 首位
            if (curIndex == 0) {
                imgL = [_imgSource lastObject];
                imgC = _imgSource[curIndex];
                long nextIndex = curIndex == sCount - 1 ? curIndex : curIndex + 1;
                imgR = _imgSource[nextIndex];
                // 末位
            } else if (curIndex == sCount - 1){
                long lastIndex = curIndex == 0 ? curIndex : curIndex - 1;
                imgL = _imgSource[lastIndex] ;
                imgC = [_imgSource lastObject];
                imgR = _imgSource[0];
                // 中间
            } else {
                imgL = _imgSource[curIndex - 1];
                imgC = _imgSource[curIndex];
                imgR = _imgSource[curIndex + 1];
            }
            
            imgList = [[NSArray alloc] initWithObjects:imgL, imgC, imgR, nil];
        }
        
        return imgList;
    }
    
    - (void)doubleTapClick:(UITapGestureRecognizer *)tap
    {
        //    在这里实现点按两下的action操作
        //    判断当前放大的比例
        if (_scrCenter.zoomScale > kImgZoomScaleMin) {
            [_scrCenter setZoomScale:kImgZoomScaleMin animated:YES];
        }
        else
            [_scrCenter setZoomScale:kImgZoomScaleMax animated:YES];
    }
    
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
        UIImageView *vCenter = [_imgViewDic valueForKey:@"imgCenter"];
        return vCenter;
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
        if (self == scrollView) {
            CGFloat width = self.frame.size.width;
            int currentOffset = scrollView.contentOffset.x/width - 1;
            [self setCurIndex:_curIndex + currentOffset];
            
            //        返回三个视图中的中间位置
            [scrollView setContentOffset:CGPointMake(width, 0) animated:NO];
            [_scrCenter setZoomScale:kImgZoomScaleMin];
        }
    }
    
    // 谦让双击放大手势
    - (void)requireDoubleGestureRecognizer:(UITapGestureRecognizer *)tep{
        [tep requireGestureRecognizerToFail:[[self gestureRecognizers] lastObject]];
    }
    /*
     // Only override drawRect: if you perform custom drawing.
     // An empty implementation adversely affects performance during animation.
     - (void)drawRect:(CGRect)rect {
     // Drawing code
     }
     */
    
    @end

    这样,我们就完成了我们瀑布流图片编写。


  • 相关阅读:
    夏普比率(Sharpe Ratio)
    资管产品与信托产品区别
    通道业务是什么业务?怎么做到为银行做资产从表内到表外的流动性搬运?
    什么是MBS,ABS和CDO
    Oracle的OFA架构
    oracle-TNS是什么?
    Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
    oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件
    linux下安装oracle
    金融人物
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026958.html
Copyright © 2020-2023  润新知