IOS开发--横向流水布局实现

//
//  ViewController.m
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

#import "ViewController.h"
#import "PhotoCell.h"
#import "PhotoLayout.h"

/*
 // a , b , c a = b + c
 //    int d = (2,3,5);

 // 高聚合,低耦合
 int a = ({
 int b = 2;
 int c = 3;
 a = b + c;
 20;
 });
 */

/*
 UICollectionView注意点:
 1.初始化必须要传入布局,(流水布局:九宫格布局)
 2.UICollectionViewCell必须要注册
 3.必须自定义cell
 */

#define XMGScreenW [UIScreen mainScreen].bounds.size.width
static NSString * const ID = @"cell";
@interface ViewController ()<UICollectionViewDataSource>

@end

@implementation ViewController

// 思路:照片浏览布局:流水布局,在拖到的时候,在原来基础上重新计算下布局 -> 在原来功能上再添加功能,自定义流水布局
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 创建流水布局
    PhotoLayout *layout = ({
        layout = [[PhotoLayout alloc] init];
        // 尺寸
        layout.itemSize = CGSizeMake(180, 180);
        // 设置滚动方向:水平
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        // 设置额外滚动区域
        CGFloat inset = (XMGScreenW - 180) * 0.5;
        layout.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset);

        layout;
    });

    // 创建UICollectionView:默认为黑色
    UICollectionView *collectionView = ({
        collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        collectionView.bounds = CGRectMake(0, 0, self.view.bounds.size.width, 200);
        collectionView.center = self.view.center;
        collectionView.backgroundColor = [UIColor cyanColor];
        collectionView.showsHorizontalScrollIndicator = NO;
        [self.view addSubview:collectionView];

        // 设置数据源
        collectionView.dataSource = self;
        collectionView;
    });

    // 注册cell
    [collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([PhotoCell class]) bundle:nil] forCellWithReuseIdentifier:ID];
}

#pragma mark -UICollectionViewDataSource
// 返回有多少个cell
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 20;
}

// 返回每个cell长什么样
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];

    NSString *imageName = [NSString stringWithFormat:@"%ld",indexPath.row + 1];

    cell.image = [UIImage imageNamed:imageName];

    return cell;
}

@end

前言:因为时间缘故,很少进行通俗易懂的算法思路讲解,这里先展示动态图片效果,然后后面的内容我就直接上关键源码了。

效果展示图;

源码百度云盘下载链接: http://pan.baidu.com/s/1eQOOixc 密码: duu8

源码:

//  PhotoCell.h
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface PhotoCell : UICollectionViewCell

@property (nonatomic, strong) UIImage *image;

@end

================两个文件的分水岭==================
//
//  PhotoCell.m
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

26
#import "PhotoCell.h"

@interface PhotoCell ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation PhotoCell

- (void)awakeFromNib {
    // Initialization code
}

- (void)setImage:(UIImage *)image
{
    _image = image;

    _imageView.image = image;

}

@end

//
//  PhotoLayout.h
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface PhotoLayout : UICollectionViewFlowLayout

@end

==============两个文件的分水岭================

//
//  PhotoLayout.m
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

#import "PhotoLayout.h"
#define XMGScreenW [UIScreen mainScreen].bounds.size.width
@implementation PhotoLayout

// 复杂效果: 分析 ->
// cell离中心点距离越近(delta越小),就越大,越远,就越小
// 距离中心点
// 知道哪些cell需要缩放:显示出来的cell才需要进行布局

// 给定一个区域,就返回这个区域内所有cell布局
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
    // 1.获取显示区域,bounds 而不是整个滚动区域,这样设置的子控件就控制在显示区域范围内了。
    CGRect visiableRect = self.collectionView.bounds;

    // 2.获取显示区域内的cell的布局
    NSArray *attributes = [super layoutAttributesForElementsInRect:visiableRect];

    // 3.遍历cell布局
    CGFloat offsetX = self.collectionView.contentOffset.x;
    for (UICollectionViewLayoutAttributes *attr in attributes) {
        // 3.1 计算下距离中心点距离
        CGFloat delta = fabs(attr.center.x - offsetX - XMGScreenW * 0.5);
        // 1 ~ 0.75
        CGFloat scale = 1 - delta / (XMGScreenW * 0.5) * 0.25;//1-(0~0.5) = 1~0.5 --> 1-(0~0.5)×0.25 = (1~0.75)
        attr.transform = CGAffineTransformMakeScale(scale, scale);
    }

    return attributes;
}

// Invalidate:刷新
// 是否允许在拖动的时候刷新布局
// 谨慎使用,YES:只要一滚动就会布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return YES;
}

最后的关键代码:

//
//  ViewController.m
//  自定义流水布局
//
//  Created by xmg on 16/1/15.
//  Copyright  2016年 HeYang. All rights reserved.
//

#import "ViewController.h"
#import "PhotoCell.h"
#import "PhotoLayout.h"

/*
 // a , b , c a = b + c
 //    int d = (2,3,5);

 // 高聚合,低耦合
 int a = ({
 int b = 2;
 int c = 3;
 a = b + c;
 20;
 });
 */

/*
 UICollectionView注意点:
 1.初始化必须要传入布局,(流水布局:九宫格布局)
 2.UICollectionViewCell必须要注册
 3.必须自定义cell
 */

#define XMGScreenW [UIScreen mainScreen].bounds.size.width
static NSString * const ID = @"cell";
@interface ViewController ()<UICollectionViewDataSource>

@end

@implementation ViewController

// 思路:照片浏览布局:流水布局,在拖到的时候,在原来基础上重新计算下布局 -> 在原来功能上再添加功能,自定义流水布局
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 创建流水布局
    PhotoLayout *layout = ({
        layout = [[PhotoLayout alloc] init];
        // 尺寸
        layout.itemSize = CGSizeMake(180, 180);
        // 设置滚动方向:水平
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        // 设置额外滚动区域
        CGFloat inset = (XMGScreenW - 180) * 0.5;
        layout.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset);

        layout;
    });

    // 创建UICollectionView:默认为黑色
    UICollectionView *collectionView = ({
        collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        collectionView.bounds = CGRectMake(0, 0, self.view.bounds.size.width, 200);
        collectionView.center = self.view.center;
        collectionView.backgroundColor = [UIColor cyanColor];
        collectionView.showsHorizontalScrollIndicator = NO;
        [self.view addSubview:collectionView];

        // 设置数据源
        collectionView.dataSource = self;
        collectionView;
    });

    // 注册cell
    [collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([PhotoCell class]) bundle:nil] forCellWithReuseIdentifier:ID];
}

#pragma mark -UICollectionViewDataSource
// 返回有多少个cell
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 20;
}

// 返回每个cell长什么样
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];

    NSString *imageName = [NSString stringWithFormat:@"%ld",indexPath.row + 1];

    cell.image = [UIImage imageNamed:imageName];

    return cell;
}

@end
时间: 2024-10-26 11:52:52

IOS开发--横向流水布局实现的相关文章

IOS开发之绝对布局和相对布局(屏幕适配)

        之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便.在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下面会结合两个小demo来学习一下我们IOS开发中UI的绝对定位和相对定位.在前面的博客中所用到的UI事例用的全是绝对定位,用我们Storyboard拖拽出来的控件全是绝对定位的,就是我们可以同改变组件的frame来改变组件的位置和大小.而相对定位则不同,相对定位是参考组件周围的元素来

虚拟机安装iOS开发环境流水帐,附iOS Developer Program流水帐

  写在前面:1.这里只是体验iOS开发的一个权宜之计,虚拟机中运行Mac OS X相当缓慢.如果需要真正的开发还是需要购买Mac机器的.2.这里以雪豹为例,Lion没找到--     1.我的机器环境:Thinkpad X61,Windows 7 64bit旗舰版,4G DDR2内存     2.需要下载的软件:基础环境:VMWare 7.0及以上(低版本在Win7上有问题),Mac OS X Snow Leopard.iso.接下来是两个启动文件,因为雪豹的iso无法在虚拟机上直接启动,搜索

IOS开发之新浪围脖

IOS开发和Web开发一样,网络请求方式包括Get和Post方式.Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据.下面还会提到如何在我们的项目中使用CocoaPods, CocoaPods的安装和使用教程请参考链接http://code4app.com/article/cocoapods-install-usage.上面详细的介绍了CocoaPods的安装过程和如何通过CocoaPods引入第三方类库.在本篇博客中提到CocoaPods

ios开发布局-在ios开发中怎么样删除分区后多余的表格

问题描述 在ios开发中怎么样删除分区后多余的表格 在ios的开发中怎么样删除分区后多余的表格让他的背景色和view的背景色一致 解决方案 我的处理方法是多加一行表格 然后最后一行表格的高度为屏幕高度减去全部的表格高度 然后给最后一行表格的颜色改为透明

ios开发 布局-IOS开发中Scrollview怎么显示图片和标题

问题描述 IOS开发中Scrollview怎么显示图片和标题 如题,怎么显示成类似九宫格的样式,可以点击进入别的页面,小白,请多多指教 解决方案 用collection view吧.用法和tableview差不多 解决方案二: Scrollview显示图片,直接在Scrollview上面加载一个imageview显示图片就行,标题也是一样,直接加label就行.Scrollview只是用来滑动而已.可以在Scrollview的点击回调函数里面实现页面跳转. 解决方案三: iOS 开发中如何显示网

iOS开发 用masonry设置collection的高度时报错

问题描述 iOS开发 用masonry设置collection的高度时报错 设置make.height.mas_equalTo(500);后报错 [self.view addSubview:self.categoryDetailView]; [self.categoryDetailView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(64); make.right.mas_equalTo(0); m

iOS开发系列--打造自己的“美图秀秀”

概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Quartz 2D在UI

iOS开发中标签控制器的使用——UITabBarController

iOS开发中标签控制器的使用--UITabBarController 一.引言         与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理方式是纵向的,采用push与pop切换控制器,标签的管理是横向的,通过标签的切换来改变控制器,一般我们习惯将tabBar作为应用程序的根视图控制器,在其中添加导航,导航中在对ViewController进行管理. 二.创建一个标签控制器         通过如下的步骤,我们可以很简便

Android开发中LinearLayout布局技巧及layout中drawable属性区别

先介绍drawable属性的区别,这个算是比较简单的,但是还是有一点点的小细节需要进行说明,drawable有五个文件夹,分别为hdpi,ldpi,mdpi,xdpi,xxdpi,这五个文件夹想必大家都知道,其实就是为了适应不同分辨率,由于手机分辨率的不同,因此我们的图片需要适应不同手机的分辨率...hdpi:480x800   mdpi:480x320   ldpi:320x240xdpi:1280x720 xxdpi 1920x1280其实这个数字并不是非常精确的,只是说明每一个阶段都有一个