UI-图片轮播器

效果图

LoopView.h

1 #import <UIKit/UIKit.h>
2
3 @interface LoopView : UICollectionView
4
5 - (instancetype)initWithUrls:(NSArray <NSURL *> *)urls didSelectedIndex:(void (^)(NSInteger index))selectedIndex;
6
7 @end

LoopView.m

 1 #import "LoopView.h"
 2 #import "LoopViewFlowLayout.h"
 3 #import "LoopViewCell.h"
 4
 5 NSString *const LoopViewCellIdentifier = @"LoopViewCellIdentifier";
 6
 7 @interface LoopView() <UICollectionViewDataSource, UICollectionViewDelegate>
 8 @property (nonatomic, copy) void (^selectedCallBack)(NSInteger index);
 9 @end
10
11 @implementation LoopView {
12     NSArray <NSURL *> *_urls;
13 }
14
15 - (instancetype)initWithUrls:(NSArray <NSURL *> *)urls didSelectedIndex:(void (^)(NSInteger))selectedIndex {
16     self = [super initWithFrame:CGRectZero collectionViewLayout:[LoopViewFlowLayout new]];
17     if (self) {
18         _urls = urls;
19         _selectedCallBack = selectedIndex;
20
21         self.dataSource = self;
22         self.delegate = self;
23
24         [self registerClass:[LoopViewCell class] forCellWithReuseIdentifier:LoopViewCellIdentifier];
25
26         // 滚动到第 count 的位置
27         if (_urls.count > 1) {
28             dispatch_async(dispatch_get_main_queue(), ^{
29                 NSIndexPath *indexPath = [NSIndexPath indexPathForItem:_urls.count inSection:0];
30
31                 [self scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
32             });
33         }
34     }
35     return self;
36 }
37
38 #pragma mark - UICollectionViewDataSource
39 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
40     // 如果只有一张图片,不滚动,否则显示 2 倍 的图像
41     return _urls.count * (_urls.count == 1 ? 1 : 100);
42 }
43
44 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
45
46     LoopViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:LoopViewCellIdentifier forIndexPath:indexPath];
47
48     cell.url = _urls[indexPath.item % _urls.count];
49
50     return cell;
51 }
52
53 /// 滚动视图停止滚动
54 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
55     NSInteger offset = scrollView.contentOffset.x / scrollView.bounds.size.width;
56
57     // 判断是否是第0页和最后一页
58     if (offset == 0 || offset == ([self numberOfItemsInSection:0] - 1)) {
59
60         // 第 0 页,切换到 count 位置,最后一页,切换到 count - 1 的位置
61         offset = _urls.count - (offset == 0 ? 0 : 1);
62
63         // 调整 offset
64         scrollView.contentOffset = CGPointMake(offset * scrollView.bounds.size.width, 0);
65     }
66 }
67
68 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
69     if (_selectedCallBack != nil) {
70         _selectedCallBack(indexPath.item % _urls.count);
71     }
72 }
73
74 @end

LoopViewFlowLayout.m

 1 #import "LoopViewFlowLayout.h"
 2
 3 @implementation LoopViewFlowLayout
 4
 5 - (void)prepareLayout {
 6     [super prepareLayout];
 7
 8     self.itemSize = self.collectionView.bounds.size;
 9     self.minimumLineSpacing = 0;
10     self.minimumInteritemSpacing = 0;
11     self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
12
13     self.collectionView.pagingEnabled = YES;
14     self.collectionView.bounces = NO;
15     self.collectionView.showsVerticalScrollIndicator = NO;
16     self.collectionView.showsHorizontalScrollIndicator = NO;
17 }
18
19 @end

LoopViewCell.h

1 #import <UIKit/UIKit.h>
2
3 @interface LoopViewCell : UICollectionViewCell
4
5 @property (nonatomic) NSURL *url;
6
7 @end

LoopViewCell.m

 1 #import "LoopViewCell.h"
 2
 3 @implementation LoopViewCell {
 4     UIImageView *_imageView;
 5 }
 6
 7 - (instancetype)initWithFrame:(CGRect)frame {
 8     self = [super initWithFrame:frame];
 9     if (self) {
10         _imageView = [[UIImageView alloc] initWithFrame:self.bounds];
11         [self.contentView addSubview:_imageView];
12     }
13     return self;
14 }
15
16 - (void)setUrl:(NSURL *)url {
17     _url = url;
18
19     NSData *data = [NSData dataWithContentsOfURL:url];
20     _imageView.image = [UIImage imageWithData:data];
21 }
22
23 @end

ViewController.m

 1 #import "ViewController.h"
 2 #import "LoopView.h"
 3
 4 @interface ViewController ()
 5
 6 @end
 7
 8 @implementation ViewController {
 9     NSArray <NSURL *> *_urls;
10 }
11
12 - (void)viewDidLoad {
13     [super viewDidLoad];
14
15     // 1. 加载数据
16     [self loadData];
17
18     // 2. 图片轮播器视图
19     LoopView *loopView = [[LoopView alloc] initWithUrls:_urls didSelectedIndex:^(NSInteger index) {
20     }];
21
22     CGFloat width = self.view.bounds.size.width;
23     loopView.frame = CGRectMake(20, width / 2, width - 40, 200);
24     [self.view addSubview:loopView];
25 }
26
27 - (void)loadData {
28     NSMutableArray *array = [NSMutableArray array];
29
30     for (int i = 0; i < 3; i++) {
31         NSString *fileName = [NSString stringWithFormat:@"%02zd.jpg", (i + 1)];
32         NSURL *url = [[NSBundle mainBundle] URLForResource:fileName withExtension:nil];
33
34         [array addObject:url];
35     }
36     _urls = array.copy;
37 }
38
39 @end
时间: 2024-10-26 03:49:32

UI-图片轮播器的相关文章

UISCrollView —— 图片轮播器封装实现(三)——(第三讲)

1.分析 利用xib布局,然后自定义一个UIView,解析xib,然后利用控制器传入数据,将其加载到控制器的view上展示即可 2. 程序结构 3. 代码具体实现 1>  xib文件 2>  创建类 XMGPageView,然后将其与xib文件关联,选中xib文件,然后设置下文中 " custom class " 为定义的类,让其来管理xib 1>    (如图,设置xib与类关联) 2>  XMGPageView.h 文件中,声明分页图片数组属性,及其一个快速

UIScrollView实现图片轮播器及其无限循环效果

图片轮播器: 一.实现效果 实现图片的自动轮播            二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" 2 3 @interface YYViewController () <UIScrollViewDelegate> 4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; 5 /** 6 * 页码 7 */ 8 @prop

UISCrollView —— 图片轮播器实现(三)——(第二讲)

1. 所用知识点 1> UIScrollView的基本属性,和UIPageControl设置,还有就是要用到NSTimer来定时实现UIScrollView的图片轮播 2> NSTimer简单介绍: 2.1  NSTimer叫做“定时器”,它的作用如下 * 在指定的时间执行指定的任务 * 每隔一段时间执行指定的任务 2.2  NSTimer简单使用: 1> 调用下面的方法就会开启一个定时任务 + (NSTimer *)scheduledTimerWithTimeInterval:(NST

Android高级图片滚动控件,编写3D版的图片轮播器

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博客了,我也是深感惭愧.那么今天的这篇既然是阔别了一个多月的文章,当然要带来更加给力点的内容了,那么话不多说,赶快进入到今天的正题吧. 说 到图片轮播器,很多的Android应用中都会带有这个功能,比如说网易新闻.淘宝等.最新我们公司的一款应用也加入了这个功能,并且在图片轮播的基础上 还增加了三维立体

ios开发图片轮播器以及定时器小问题

一:图片轮播器效果如图:能实现自动轮播,到最后一页时,轮播回来,可以实现拖拽滚动 二:代码: 1 #import "ViewController.h" 2 static CGFloat const imageCount = 5; 3 @interface ViewController ()<UIScrollViewDelegate> 4 /*scrollView*/ 5 @property (nonatomic,weak)UIScrollView *scroll; 6 /*

UIScorllView和UIPageControl的使用实现图片轮播器

首先我们要先建一个project,选择iOS下的第一个Application 中的Single View Application 开始工作已经准备完毕现在我们进入到Main.storyboard拖控件 需要用到的控件有 UIScrollView也就是滚动的那个 UIPageControl也就是图片下面那几个小点 NSTimer就是定时器让其自动换页的 第一步:拖控件连线 在Main.storyboard拖一个UIScrollView放在屏幕上,在UIScrollView下面放一个UIPageCo

图片轮播器

? 1 SB里只需要两个控件: UIScrollView UIPageControl ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 7

IOS 05 UIScrollView介绍 图片轮播器

移动设备的屏幕?大?小是极其有限的,因此直接展?示在?用户眼前的内容也相当有限 当展?示的内容较多,超出?一个屏幕时,?用户可通过滚动?手势来查看屏幕以外的内容 普通的UIView不具备滚动功能,不能显?示过多的内容 UIScrollView是?一个能够滚动的视图控件,可以?用来展?示?大量的内容,并且可以通过滚 动查看所有的内容 在IOS中UIScrollView这个控件还是比较常用和重要的. 很多时候,我们想在UIScrollView正在滚动 或 滚动到某个位置 或者 停?止滚动 时做?一些

Swift版本的图片轮播器框架

由于在开发中,总是要写图片轮播器之类的东东,写的烦了,忍不住就用Swift写了一个非常方便的图片轮播器的框架https://github.com/SarielTang/CycleView 大家在使用的时候,只需要像这样: import CycleView class className : PictureCycleController{ //override loadView function //重写loadViewe方法 override func loadView() { super.lo

iOS开发 - UIPageControl实现分页图片轮播器

分页相关属性 只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示 一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下 一共有多少页 @property(nonatomic) NSInteger numberOfPages; 当前显示的页码 @property(nonatomic) NSInteger currentPage; 只有一页时,是否需要隐藏页码指示器 @