iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置

转载自:http://www.cnblogs.com/tmf-4838/p/5361271.html

#import "ViewController.h"
#import <ImageIO/ImageIO.h>
#import "UIImageView+WebCache.h"

@interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>
// 数据源
@property (nonatomic, strong)NSMutableArray *arrIcon;
// 显示控件
@property (nonatomic, strong)UICollectionView *clv;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 获取数据源写成,url写成plist文件
    /*
    [[NSArray arrayWithObjects:
     @"http://image.tianjimedia.com/uploadImages/2012/273/M6J97CZGYA4Z_NatGeo01_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/J3ME8ZNAG315_NatGeo02_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/EL9230AP5196_NatGeo03_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/SYJ43SG47PC8_NatGeo04_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/605X52620G0M_NatGeo05_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/7H5RQ1ELP8MZ_NatGeo06_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/Z2W429E0203R_NatGeo07_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/BG011W9LWL77_NatGeo08_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/936FM8NN22J2_NatGeo09_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/H79633PPEFZW_NatGeo10_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/54Z01YZ78050_NatGeo11_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/61V3658UA4IY_NatGeo12_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/H3HL7YILNGKB_NatGeo13_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/1V6797311ZA5_NatGeo14_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/93L81IKN156R_NatGeo15_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/V93E1EGU2G0Z_NatGeo16_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/QC205CD96IWZ_NatGeo17_250.jpg",@"http://image.tianjimedia.com/uploadImages/2012/273/M6J97CZGYA4Z_NatGeo01_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/J3ME8ZNAG315_NatGeo02_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/EL9230AP5196_NatGeo03_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/SYJ43SG47PC8_NatGeo04_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/605X52620G0M_NatGeo05_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/7H5RQ1ELP8MZ_NatGeo06_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/Z2W429E0203R_NatGeo07_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/BG011W9LWL77_NatGeo08_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/936FM8NN22J2_NatGeo09_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/H79633PPEFZW_NatGeo10_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/54Z01YZ78050_NatGeo11_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/61V3658UA4IY_NatGeo12_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/H3HL7YILNGKB_NatGeo13_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/1V6797311ZA5_NatGeo14_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/93L81IKN156R_NatGeo15_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/V93E1EGU2G0Z_NatGeo16_250.jpg",
     @"http://image.tianjimedia.com/uploadImages/2012/273/QC205CD96IWZ_NatGeo17_250.jpg",
     nil] writeToFile:@"/Users/Mu/Desktop/pic.plist" atomically:YES];
   */

    self.arrIcon = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"pic" ofType:@"plist"]];

    // 设置滚动方向:FlowLayout简单说是一个直线对齐的layout
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    // 滚动方向
    layout.scrollDirection = UICollectionViewScrollDirectionVertical;

    // 尾部距离屏幕尺寸(竖直模式,x没有作用)
    layout.headerReferenceSize = CGSizeMake(0, 30); //头部尺寸
    layout.footerReferenceSize = CGSizeMake(0, 100); //尾部尺寸
    // 缩进:和屏幕上下以及相对于屏幕的左右间距(上左下右):左右会影响到竖直间距
    // 默认是10:终于可以改变了
    layout.sectionInset = UIEdgeInsetsMake(1, 0, 1, 0);
    // 设置图片的尺寸
    //layout.itemSize = CGSizeMake(WID/4.0-1, WID/4.0-1);
    //layout.itemSize = CGSizeMake((WID-30)/4.0, (WID-30)/4.0);
    // 目前发现:预估尺寸等效于于itemSize
    layout.estimatedItemSize = CGSizeMake(WID/4.0-1, WID/4.0-1);
    // 前提minimumInteritemSpacing为0(默认为10)
    layout.minimumInteritemSpacing = 0;
    // 行间距(竖直模式)
    layout.minimumLineSpacing = 1;
    // 设置页眉和页脚是否一直存在
    layout.sectionHeadersPinToVisibleBounds= NO;

    // 创建对象
    self.clv = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
    // 指定代理
    self.clv.delegate = self;
    self.clv.dataSource = self;

    // 注册唯一标识
    [self.clv registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"reuse"];
    [self.clv registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headReuse"];
    [self.clv registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footReuse"];

    // 添加到主视图
    [self.view addSubview:self.clv];
    self.clv.backgroundColor = [UIColor whiteColor];

    // 设置偏移量,隐藏UISegmentedControl
    self.clv.contentOffset = CGPointMake(0, 30);
}

#pragma - UICollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    [self.arrIcon addObject:[NSNull null]];
    [self.arrIcon addObject:[NSNull null]];
    return self.arrIcon.count;
}

// 首先是cell本身作为容器view   然后是一个大小自动适应整个cell的backgroundView,用作cell平时的背景   再其上是selectedBackgroundView,是cell被选中时的背景   最后是一个contentView,自定义内容应被加在这个view上
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 重用队列标识
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"reuse" forIndexPath:indexPath];

    // 第三方Image请求
    UIImageView *imv = [[UIImageView alloc] init];
    [imv sd_setImageWithURL:self.arrIcon[indexPath.row] placeholderImage:[UIImage imageNamed:@"u=2312994427,1092373000&fm=21&gp=0.jpg"] options:SDWebImageRetryFailed];
    cell.backgroundView = imv;

    // 选中更换背景图_1(点击选中即更换)
    //cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Img361868872.jpg"]];

    return cell;
}

// 页眉和页脚出现即调用;页眉要第二次出现才会调用
// Supplementary Views 追加视图 如果你对UITableView比较熟悉的话,可以理解为每个Section的Header或者Footer,用来标记每个section的view
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    if (kind == UICollectionElementKindSectionHeader)
    {
        // 重用标识
        UICollectionReusableView *ppView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"headReuse" forIndexPath:indexPath];
        ppView.backgroundColor = [UIColor clearColor];
        // 添加子控件
        UISegmentedControl *sgmc = [[UISegmentedControl alloc] initWithItems:@[@"名称", @"日期", @"大小"]];
        sgmc.tintColor = [UIColor purpleColor];
        sgmc.bounds = CGRectMake(0, 0, 100, 15);
        sgmc.center = ppView.center;
        [ppView addSubview:sgmc];

        return ppView;
    }else
    {
        // 重用标识
        UICollectionReusableView *ppView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"footReuse" forIndexPath:indexPath];
        ppView.backgroundColor = [UIColor clearColor];

        // 添加数量和时间
        UILabel *lbl = [[UILabel alloc] init];
        lbl.numberOfLines = 2;
        lbl.textAlignment = NSTextAlignmentCenter;
        lbl.frame = CGRectMake((WID-200)/2, 35, 200, 30);
        lbl.font = [UIFont systemFontOfSize:10];

        NSDate *date = [NSDate date];
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        NSInteger seconds = [zone secondsFromGMTForDate:date];
        NSDate *now = [date dateByAddingTimeInterval:seconds];

        // 格式化NSDate为NSString:会自动添加28800s即等于now
        NSDateFormatter *fm = [NSDateFormatter new];
        fm.dateFormat = @"yyyy年MM月dd日HH时mm分ss秒";

        // 需要取子串
        NSString *time = [[fm stringFromDate:date] substringFromIndex:11];

        NSString *num = [NSString stringWithFormat:@"%lu张照片", self.arrIcon.count];
        lbl.text = [NSString stringWithFormat:@"%@\r\n%@", num, time];

        [ppView addSubview:lbl];
        NSLog(@"等效:%@;%@", now, [fm stringFromDate:date]);

        return ppView;
    }

}
// 对于Decoration Views,提供方法并不在UICollectionViewDataSource中,而是直接UICollectionViewLayout类中的(因为它仅仅是视图相关,而与数据无关)

// 选中跟换背景图_2(长按更换松开恢复)
// 需要允许为YES,不然走发哦这里就停了不会执行didHighlightItemAtIndexPath
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 没有创建新对象:使用的还是indexPath队列的cell
    UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Img361868872.jpg"]];
}
- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    // 没有创建新对象:使用的还是indexPath队列的cell
    UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];

    UIImageView *imv = [[UIImageView alloc] init];
    [imv sd_setImageWithURL:self.arrIcon[indexPath.row] placeholderImage:[UIImage imageNamed:@"u=2312994427,1092373000&fm=21&gp=0.jpg"] options:SDWebImageRetryFailed];
    cell.backgroundView = imv;

}UIImageView *imv;
// 选中
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%lu", indexPath.row);
}
@end
时间: 2025-01-07 13:23:49

iOS SDWEBImage和collectionView的组合,以及collectionView的随意间距设置的相关文章

SDWEBImage和collectionView的组合,以及collectionView的随意间距设置

#import "ViewController.h" #import <ImageIO/ImageIO.h> #import "UIImageView+WebCache.h" @interface ViewController ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> // 数据源 @property

iOS开发实战——CollectionView中cell的间距设置

我在前面多篇博客中详细讲解了CollectionView的使用与自定义CollectionViewCell的设计,可以参考<iOS开发实战--CollectionView点击事件与键盘隐藏结合案例><iOS高级开发--CollectionView修改cell的文本及模型重构>这几篇博客.但是今天还是需要来讲讲CollectionView实现中的一个小小的坑,这是我最近在网上浏览时发现很多开发者经常犯的错,所以我觉得有必要来好好谈一谈. 一个CollectionView控件中,两个c

iOS下用一行代码实现tableview(collectionview)的parallax效果

效果和https://github.com/jberlana/JBParallaxCell一样.实现cell的滚动视差. 原理很简单,就是一个等比公式  cell的图片位置 / cell图片可以滑动的总长 = cell在table中的位置 / cell 可滑动总长  实现方法: 1> 在cell的UIImageView上添加父视图UIView,clipsToBounds设置为yes,用来剪切UIImageView,为其限定大小. 2>在vc的 -(void)scrollViewDidScrol

猫猫学iOS 之广告轮播图,collectionView制作(源码)

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 源码共享:https://github.com/znycat/NYCarouselView 效果图 源代码 NYCarouselView.h // // NYCarouselView.h // 广告轮播CollectionView // // Created by IOS on 15/12/26. // Copyright ? 2015年 com.itcat.c

猫猫学iOS 之广告轮播图,collectionView制作

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 效果图 不多说,好不好先看效果,之前做过一个scrollView的轮播图,但是很局限,很多多余代码,今天猫猫重新做了一个用collectionView的流水布局做的一个,可以拿去做广告轮播,也可以做系统新特性哦,来,看下效果吧. 源码共享:https://github.com/znycat/NYCarouselView 很久很久以前就想做了.总而言之,猫猫代码有

collectionView 中cell间距设置建议

应该是调节UICollectionViewFlowLayout的minimumInteritemSpacing属性,这个是调节同一行的cell之间的距离的. 使用-(CGFloat )collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)se

iOS - SDWebImage的原理以及使用流程

IOS框架研究之SDWebImage的原理以及使用流程 SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. SDWebImage支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.SDWebImage加载图片的流程: 入口 setImageWithURL:placeholderImage:options: 会先把 placeholder

ios SDWebImage 图片加载显示菊花

之前一直不知道怎样给图片加载的时候显示菊花, 都用placeholder来代替了, 原来SDWebImage 自带这个功能: // 只要在加载图片的位置这么写就行了: __block UIActivityIndicatorView *activityIndicator; [cell.imgView sd_setImageWithURL:url placeholderImage:nil options:SDWebImageProgressiveDownload progress:^(NSInteg

iOS SDwebImage 使用说明

SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征.使用示范的代码: UITableView使用UIImageView+WebCache类(基本应用,UIImageView的一个category) 前提#import导入UIImageView+WebCache.h文件,然后在tableview的cellFor