iOS 自定义瀑布流相册控件

控件分为.h 和 .m文件

效果图

控件分为3列来显示

  1. .h文件包含协议声明和控件声明
@protocol UIPhotosViewDelegate <NSObject>

// 当点击某个图片时,返回该图片所在的UIImageView,参数即返回的imageview
- (void)clickedWithView:(UIImageView *)view;

@end

@interface UIPhotosView : UIView <UIPhotosViewDelegate> {
    
}

@property (nonatomic, retain) id<UIPhotosViewDelegate> delegate;  // 自定义协议

@property (nonatomic, retain) UIView *leftView;                   // 左侧视图框
@property (nonatomic, retain) UIView *midView;                    // 中间视图框
@property (nonatomic, retain) UIView *rightView;                  // 右侧视图框

@property (nonatomic, assign) CGFloat subWidth;                   // 视图框的宽度,即1/3

- (void)addImage:(UIImage *)image;                                // 向控件加入一张图片

@end

2. .m文件包含控件实现

@implementation UIPhotosView

// 初始化
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _subWidth = frame.size.width / 3.0;
        
        _leftView = [[UIView alloc] init];
        _leftView.frame = CGRectMake(0, 0, _subWidth, 1);
        [self addSubview:_leftView];
        
        _midView = [[UIView alloc] init];
        _midView.frame = CGRectMake(_subWidth, 0, _subWidth, 1);
        [self addSubview:_midView];
        
        _rightView = [[UIView alloc] init];
        _rightView.frame = CGRectMake(_subWidth*2, 0, _subWidth, 1);
        [self addSubview:_rightView];
    }
    return self;
}

// 加入图片
- (void)addImage:(UIImage *)image {
    CGFloat leftHeight = _leftView.frame.size.height;
    CGFloat midHeight = _midView.frame.size.height;
    CGFloat rightHeight = _rightView.frame.size.height;
    
    UIImageView *view = [self createImageView:image];  // 创建imageview
    
    CGFloat wid = _subWidth;
    CGFloat hei = image.size.height / (image.size.width / _subWidth);
    
    // 判断加入最短的view内
    if (leftHeight <= midHeight && leftHeight <= rightHeight) {
        [_leftView addSubview:view];
        view.frame = CGRectMake(0, leftHeight, wid, hei);
        leftHeight = leftHeight + hei;
        _leftView.frame = CGRectMake(0, 0, wid, leftHeight);
    }
    else if (midHeight <= rightHeight) {
        [_midView addSubview:view];
        view.frame = CGRectMake(0, midHeight, wid, hei);
        midHeight = midHeight + hei;
        _midView.frame = CGRectMake(_subWidth, 0, wid, midHeight);
    }
    else {
        [_rightView addSubview:view];
        view.frame = CGRectMake(0, rightHeight, wid, hei);
        rightHeight = rightHeight + hei;
        _rightView.frame = CGRectMake(_subWidth*2, 0, wid, rightHeight);
    }
    
    // 调整当前控件的frame
    CGFloat maxnum = [self max:leftHeight and:midHeight and:rightHeight];
    self.frame = CGRectMake(0, 0, self.frame.size.width, maxnum);
}

// 创建imageview   并绑定事件
- (UIImageView *)createImageView:(UIImage *)image {
    UIImageView *view = [[UIImageView alloc] initWithImage:image];
    view.layer.borderWidth = 1.0;
    view.layer.borderColor = [UIColor redColor].CGColor;
    
    view.userInteractionEnabled = YES;
    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] init];
    [recognizer addTarget:self action:@selector(handleClicked:)];
    [view addGestureRecognizer:recognizer];
    
    return view;
}

// 点击view时获取imageview,传给delegate
- (void)handleClicked:(UITapGestureRecognizer *)recognizer {
    UIImageView *view = recognizer.view;
    [self.delegate clickedWithView:view];
}

- (CGFloat)max:(CGFloat)n1 and:(CGFloat)n2 and:(CGFloat)n3 {
    CGFloat maxnum = n1 > n2 ? n1 : n2;
    maxnum = maxnum > n3 ? maxnum : n3;
    return maxnum;
}

@end
时间: 2024-12-23 04:07:50

iOS 自定义瀑布流相册控件的相关文章

iOS—自定义瀑布流控件

一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1 // 2 // YYWaterflowView.m 3

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

iOS开发UI篇—自定义瀑布流控件(基本实现)

iOS开发UI篇—自定义瀑布流控件(基本实现) 一.基本实现 说明:在View加载的时候,刷新数据. 1.实现代码 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 06-瀑布流 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYViewControll

iOS开发UI篇—自定义瀑布流控件(蘑菇街实现)

iOS开发UI篇—自定义瀑布流控件(蘑菇街瀑布流) 一.简单说明 关于瀑布流 1.是使用UIScrollView实现的 2.刷新数据(reloadData)方法里面做哪些事情 3.layoutSubviews方法里面做哪些事情 4.模仿UItableView进行设计 完善: 瀑布流控件第一次显示到屏幕上的时候自动的向数据源索要数据,而不需要手动调用.这需要监听View的显示,View的显示有一个方法,叫做willMoveToSuperview:在该方法中直接刷新一次数据即可. 二.把自定义的瀑布

iOS开发UI篇—自定义瀑布流控件(接口设计)

iOS开发UI篇—自定义瀑布流控件(接口设计) 一.简单说明 1.关于瀑布流 电商应用要展示商品信息通常是通过瀑布流的方式,因为每个商品的展示图片,长度和商都都不太一样. 如果不用瀑布流的话,展示这样的格子数据,还有一种办法是使用九宫格. 但利用九宫格有一个缺点,那就是每个格子的宽高是一样的,如果一定要使用九宫格来展示,那么展示的商品图片可能会变形. 为了保证商品图片能够按照原来的宽高比进行展示,一般采用的是瀑布流的方式. 2.瀑布流的特点: 由很多的格子组成,但是每个格子的宽度和高速都是不确定

iOS开发UI篇—自定义瀑布流控件(cell的循环利用)

iOS开发UI篇—自定义瀑布流控件(cell的循环利用) 一.简单说明 当滚动的时候,向数据源要cell. 当UIScrollView滚动的时候会调用layoutSubviews在tableView中也是一样的,因此,可以用这个方法来监听scrollView的滚动,可以在在这个地方向数据源索要对应位置的cell(frame在屏幕上的cell). 示例: 当scrollView在屏幕上滚动的时候,离开屏幕的cell应该放到缓存池中去,询问即将(已经)进入到屏幕的cell,对于还没有进入到屏幕的ce

iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,Cell的最大以及最小高度是在我们的布局文件中是写死的,换句话说也就是不可配置的.为了循序渐进,由浅入深呢,上篇博客暂且那么写.不过那样写太过死板,本来使用起来比较灵活的自定义布局,如果把其配置参数给写死了,就相当于在笼中的猛兽,再厉害不也白扯蛮. 在今天这篇博客中我们要接着上篇博客中的Demo,使其自定义布局

iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调>.UICollectionView之所以强大,是因为其具有自定义功能,这一自定义就不得了啦,自由度非常大,定制的高,所以功能也是灰常强大的.本篇博客就不使用自带的流式布局了,我们要自定义一个瀑布流.自定义的瀑布流可以配置其参数: 每个Cell的边距

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属