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

1、分析

利用xib布局,然后自定义一个UIView,解析xib,然后利用控制器传入数据,将其加载到控制器的view上展示即可

2、 程序结构

3、 代码具体实现

1》  xib文件

2》  创建类 XMGPageView,然后将其与xib文件关联,选中xib文件,然后设置下文中 " custom class " 为定义的类,让其来管理xib

1>    (如图,设置xib与类关联)

2>  XMGPageView.h 文件中,声明分页图片数组属性,及其一个快速创建的工厂方法,如下:

1 #import <UIKit/UIKit.h>
2
3 @interface XMGPageView : UIView
4
5 + (instancetype)pageView;
6
7 /** 所有需要展示的图片名称*/
8 @property (nonatomic, strong)NSArray *imageNames;
9 @end

3>  XMGPageView.m 文件中,要做很多事情,如:管理xib文件上的控件,

1.重写初始化方法 (在里面进行一次性的初始化)

xib :awakeFromNib

纯代码:initWithFrame

2.重写layoutSubviews, 在里面布局子控件

3.接收外界传入的数据, 重写set方法

#import "XMGPageView.h"

@interface XMGPageView ()<UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *sc;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

// 注意:NSTimer应该是weak
@property (weak, nonatomic) NSTimer *timer;
@end

@implementation XMGPageView

+ (instancetype)pageView
{
#warning 注意.这里有知识点
    return [[[NSBundle mainBundle] loadNibNamed:@"XMGPageView" owner:nil options:nil] lastObject];
}
/*
 自定义View的步骤:
 1.重写初始化方法 (在里面进行一次性的初始化)
    xib :awakeFromNib
    纯代码:initWithFrame
 2.重写layoutSubviews, 在里面布局子控件
 3.接收外界传入的数据, 重写set方法
*/

- (void)awakeFromNib
{

    self.sc.delegate = self;
    // 1.隐藏滚动条
    self.sc.showsHorizontalScrollIndicator = NO;
    self.sc.showsVerticalScrollIndicator = NO;

    // 2.设置UIScrollView的其它属性
    self.sc.bounces = NO;
    self.sc.pagingEnabled = YES;

    // 3.监听PageControl的点击事件
    [self.pageControl addTarget:self action:@selector(pageControlClick:) forControlEvents:UIControlEventValueChanged];

    // 4.通过KVC给UIPageControl的私有属性赋值, 设置自定义图片
    [self.pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"];
    [self.pageControl setValue:[UIImage imageNamed:@"other"] forKeyPath:@"_pageImage"];

    // 5.让UIScrollView每隔一段事件就切换一页
    [self startTimer];
}

#pragma mark - 内部监听
- (IBAction)pageControlClick:(UIPageControl *)sender
{

    self.sc.contentOffset = CGPointMake(sender.currentPage * self.sc.frame.size.width , 0);
}

#pragma mark - 定时器相关
- (void)startTimer
{
    // 打开定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage:) userInfo:@"lnj" repeats:YES];

    // 主线程在处理其它事件的时候, 分一点时间来处理NSTimer
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

// 切换到下一页
- (void)nextPage:(NSTimer *)timer
{
    // 1.获取下一页的页码
    NSUInteger page = self.pageControl.currentPage + 1;
    // 2.判断页码是否越界
    if (page >= _imageNames.count) {
        // 如果越界就回到第0页
        self.pageControl.currentPage = 0;
    }else
    {
        // 如果没有越界, 就进入到下一页
        self.pageControl.currentPage = page;
    }

    [self pageControlClick:self.pageControl];
}

- (void)stopTimer
{
    // 关掉定时器
    [self.timer invalidate];
}

#pragma mark - UIScrollViewDelegate
// 只要滚动就会调用
- (void)scrollViewDidScroll:(nonnull UIScrollView *)scrollView
{
    // 1.计算页码
    // 当前页码 = 偏移位 / UIScrollView的宽度
    CGFloat page = scrollView.contentOffset.x / scrollView.frame.size.width;
    int currnetPage = page + 0.5;

    // 2.修改页码
    self.pageControl.currentPage = currnetPage;
}

// 开始拖拽
- (void)scrollViewWillBeginDragging:(nonnull UIScrollView *)scrollView
{
    [self stopTimer];
}

// 结束拖拽
- (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self startTimer];

}

- (void)setImageNames:(NSArray *)imageNames
{
    _imageNames = imageNames;

    // 0.每次重新设置图片, 都需要情空以前的图片
    for (UIView *subView in self.sc.subviews) {
        [subView removeFromSuperview];
    }

    // 1.创建图片

    // 1.初始化子控件, 添加图片
    for (int i = 0; i < _imageNames.count; i++) {

        // 1.创建UIImageView
        UIImageView *iv = [[UIImageView alloc] init];

        // 2.创建图片
        NSString *imageName = _imageNames[i];
        UIImage *image = [UIImage imageNamed:imageName];
        iv.image = image;

        // 4.添加到父控件
        [self.sc addSubview:iv];
    }

    // 2.设置pageControl的页码数量
    self.pageControl.numberOfPages = _imageNames.count;

}

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGFloat width = self.sc.frame.size.width;
    CGFloat height = self.sc.frame.size.height;
    NSUInteger imageCount = self.imageNames.count;
    // 1.设置每个UIImageView的frame
    for (int i = 0; i < imageCount; i++) {
        UIImageView *iv = self.sc.subviews[i];
        iv.frame = CGRectMake(i * width, 0, width, height);
    }

    // 2.设置滚动范围
    self.sc.contentSize = CGSizeMake(imageCount * width, height);
}

@end

3》 在控制器中使用,展示数据到View上即可。

 1 #import "ViewController.h"
 2 #import "XMGPageView.h"
 3
 4 @interface ViewController ()<UIScrollViewDelegate>
 5
 6 @property(nonatomic, strong)XMGPageView *pageView;
 7 @end
 8
 9 @implementation ViewController
10
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14     /*
15      1.利用UIScrollView实现商品展示
16      2.用纯代码封装图片轮播器
17      */
18
19     // 1.创建图片轮播器
20     XMGPageView *pageView = [XMGPageView pageView];
21     // 2.设置图片轮播器的frame
22     pageView.imageNames = @[@"img_01", @"img_02", @"img_03", @"img_04", @"img_05"];
23     pageView.frame = CGRectMake(27, 97, 320, 128);
24 //    pageView.frame = CGRectMake(0, 97, 330, 200);
25     [self.view addSubview:pageView];
26     self.pageView = pageView;
27
28 }
29
30 - (void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
31 {
32     // 切换图片轮播器上的图片
33     self.pageView.imageNames = @[@"img_04", @"img_05"];
34
35 }   

好的,图片轮播器就到此结束,明天将继续讲解,Autolayout屏幕布局,明天见,^_^

时间: 2024-10-04 13:41:22

UISCrollView —— 图片轮播器封装实现(三)——(第三讲)的相关文章

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

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

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

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

IOS 05 UIScrollView介绍 图片轮播器

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

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

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

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

图片轮播器

? 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开发 - UIPageControl实现分页图片轮播器

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

沉浸式图片轮播器 -- DDGBannerScrollView使用文档

写在前面 几乎每个app都会用到图片轮播器,而且图片轮播器也越来越高大上,沉浸式等拉高了APP的档次 ,没有一个高大上的图片轮播器,都不好意思上架. 像一些知名的app都采用了图片轮播的背景渐变色,举几个栗子:优酷的首页,喜马拉雅,蜻蜓fm,哔哩哔哩漫画等, page索引也是玩的很高大上,系统的早已满足不了了需求. 鉴于此和项目的需要,在前人的基础上,整理了一个这个库,志在简单的几句代码,就能让应用看上去高大上. github:[DDGBannerScrollView](https://gith