IOS 封装轮播图

轮播图为一种常见的方式,常用于各种网站,或者App中,当然,作为APP的启动视图也是不错的选择。

闲时封装了一个,仅供新手参考。

1.新建工程,建立轮播图类


建立一个空的工程,新建一个类,起名为Carousel,继承于UIView

2.编写Carousel类接口

 1 @interface Carousel : UIView
 2 typedef NS_ENUM(NSInteger,UICarouselPageType){
 3     //建立一个枚举型,来设置Carousel的样式
 4     UICarouselPageTypeCenter,//设置pageControl在中心
 5     UICarouselPageTypeLeft,  //设置pageControl在左侧
 6     UICarouselPageTypeRight, //设置pageControl在右侧
 7 };
 8 @property(nonatomic,strong)NSArray *ImageArry;//用于接收来自外部的图片
 9 @property(nonatomic,assign)NSTimeInterval duration;//用于接收每张图片的持续时间
10 @property(nonatomic,assign)UICarouselPageType PageType;
11 @end

3.内部代码

1.用懒加载的方式定义UIScrollView和UIPageControl

  (1)为Carousel类建立延展

 

1 @interface Carousel()<UIScrollViewDelegate>
2 @property(nonatomic,strong)UIScrollView *scroll;
3 @property(nonatomic,strong)UIPageControl *pageControl;
4 @property(nonatomic,assign)int index;
5 @property(nonatomic,strong)NSTimer *timer;
6 @end

 

 

 (2)重写初始化方法

1 -(instancetype)initWithFrame:(CGRect)frame{
2     self =[super initWithFrame:frame];
3     if (self) {
4         _timer =[[NSTimer alloc]init];
5         _index=0;
6     }
7     return self;
8 }

 

(3)scrollView

 1 -(UIScrollView *)scroll{
 2     if (_scroll==nil) {
 3         _scroll =[[UIScrollView alloc]initWithFrame:self.bounds];
 4         _scroll.delegate=self;
 5         _scroll.contentSize=CGSizeMake([_ImageArry count]*WIDTH,HEIGHT);
 6         _scroll.pagingEnabled=YES;//允许整页翻动
 7         _scroll.bounces=NO;
 8         _scroll.showsHorizontalScrollIndicator=NO;
 9         _scroll.showsVerticalScrollIndicator=NO;
10         for (int i=0; i<[_ImageArry count]; i++) {
11             UIImageView *imageView =[[UIImageView alloc]initWithFrame:CGRectMake(i*WIDTH, 0, WIDTH, HEIGHT)];
12             UIImage *image=[_ImageArry objectAtIndex:i];
13             imageView.image=image;
14             [_scroll addSubview:imageView];
15         }
16     }
17     return _scroll;
18 }

 

 (4)pageControl

 1 -(UIPageControl *)pageControl{
 2     if (_pageControl ==nil) {
 3         _pageControl =[[UIPageControl alloc]init];
 4         [self setPageControlFrame];
 5         _pageControl.numberOfPages=[_ImageArry count];
 6         _pageControl.pageIndicatorTintColor=[UIColor greenColor];
 7         _pageControl.currentPageIndicatorTintColor=[UIColor redColor];
 8         [_pageControl addTarget:self action:@selector(change:) forControlEvents:UIControlEventValueChanged];
 9     }
10     return _pageControl;
11 }
12 -(void)setPageControlFrame{
13     //当PageType有不同值的时候 有不同的frame
14     if (_PageType==UICarouselPageTypeLeft) {
15         _pageControl.frame=CGRectMake(0,HEIGHT-20,150,20);
16     }else if (_PageType ==UICarouselPageTypeRight){
17         _pageControl.frame=CGRectMake(WIDTH-150,HEIGHT-20,150,20);
18     }else{
19         _pageControl.frame=CGRectMake(WIDTH/2-75,HEIGHT-20,150,20);
20     }
21 }
22 -(void)change:(UIPageControl *)page{
23     [_timer invalidate];
24     _timer=nil;
25     _scroll.contentOffset=CGPointMake(page.currentPage*WIDTH, 0);
26     _index=(int)page.currentPage;//重新给index赋值
27     _timer =[NSTimer scheduledTimerWithTimeInterval:_duration target:self selector:@selector(lunbo) userInfo:nil repeats:YES];
28 }

 

 

(5) 重写ImageArray的set方法

1 -(void)setImageArry:(NSArray *)ImageArry{
2     //重写Set方法 当ImageArray有值的时候显示scrollView和PageControl
3     if (_ImageArry!=ImageArry) {
4         _ImageArry =ImageArry;
5         [self addSubview:self.scroll];
6         [self addSubview:self.pageControl];
7         _timer =[NSTimer scheduledTimerWithTimeInterval:_duration target:self selector:@selector(lunbo) userInfo:nil repeats:YES];
8     }
9 }

 

(6)Scroll的代理方法

 1 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
 2     //开始拖动时销毁计时器
 3     [_timer invalidate];
 4     _timer =nil;
 5 }
 6 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
 7     //减速结束时重新生成计时器
 8     _index=(int)_pageControl.currentPage;//重新给index赋值
 9     _timer =[NSTimer scheduledTimerWithTimeInterval:_duration target:self selector:@selector(lunbo) userInfo:nil repeats:YES];
10 }
11 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
12     _pageControl.currentPage=scrollView.contentOffset.x/WIDTH;
13 }

 4.应用Carousel类

 1 #import "ViewController.h"
 2 #import "Carousel.h"
 3 @interface ViewController ()
 4 @end
 5 @implementation ViewController
 6 
 7 - (void)viewDidLoad {
 8     [super viewDidLoad];
 9     Carousel *lunbo =[[Carousel alloc]initWithFrame:CGRectMake(0, 100, 414, 300)];
10     NSMutableArray *arr=[[NSMutableArray alloc]initWithCapacity:9];
11     for (int index=1; index<10; index++) {
12         UIImage *image =[UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",index]];
13         [arr addObject:image];
14     }
15     lunbo.duration=1;
16     lunbo.PageType=UICarouselPageTypeCenter;
17     lunbo.ImageArry=arr;
18     [self.view addSubview:lunbo];
19     // Do any additional setup after loading the view, typically from a nib.
20 }

 

效果图:

 

 

转载于:https://www.cnblogs.com/pangxuhui/p/5671957.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式事务TCC补偿机制

文章目录 概述工作流程优缺点优点&#xff1a;缺点&#xff1a; 总结Java 示例代码 概述 TCC&#xff08;Try-Confirm-Cancel&#xff09;补偿机制是一种事务处理模式&#xff0c;用于确保分布式系统中的操作成功完成或在失败时进行补偿。TCC将一个事务拆分为三个阶段&#xf…

oracle的本地安装和PUTTY+XMING远程连接安装和oracle翻页功能

因为我也是一个初学者&#xff0c;所以可能有出错的地方&#xff0c;如果有希望大家告诉我QQ:7343696.大家公共学习&#xff0c;进步。Oracle的安装实验的环境是vmware server 1.06 rehl 5.2最小安装。oracle安装的要求。1建议的内存1G&#xff08;10g&#xff09; 9i中是51…

Flutter之导url_launcher包提示 A dependency may only have one source.

1、问题 flutter项目在pubspec.yaml导入url_launcher包&#xff0c;然后点击Pub get错误提示如下 F:\flutter_sdk\flutter\bin\flutter.bat --no-color pub get Running "flutter pub get" in flutter_1... Error on line 25, column 5 of …

这是我第一次使用代码创建出一个窗口【python 游戏实战 01】

前言 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新…

如何html中添加动态图片,把动态图片添加到视频画面中 视频添加自定义动态图片 视频加动态logo...

我前面也编写过关于视频添加动态图片的教程。前面所说的给是视频添加的动态图片是软件中自带的素材&#xff0c;虽然软件中带的动态图片种类繁多&#xff0c;但是不外乎有些时候软件中并没有我们要用的动态图片&#xff0c;这个时候我们就需要重外部添加啦&#xff0c;好多的软…

ASP.NET Core 集成AAD认证在Docker中运行时要注意的一个问题

最近我在准备一个分享&#xff0c;就是基于.NET 6.0的云原生开发Microsoft 365应用&#xff0c;这个看起来很高大上的东东&#xff0c;其实我理解主要就是能把应用容器化&#xff0c;便于与环境无关地进行分发和部署。如果理解有误&#xff0c;请大家纠正我。下面是其中的一个例…

QCon上海2015精彩回顾和总结

金秋十月&#xff0c;历时三天的QCon上海2015于10月17日顺利闭幕。本次大会邀请了100多位技术专家&#xff0c;为参会者奉上了100多场精彩的技术演讲。\\本次QCon邀请了极客邦创始人兼CEO霍泰稳&#xff0c;携程旅行网CTO、高级技术副总裁叶亚明&#xff0c;丁香园技术VP、EGO上…

ArcGIS中合并(merge)、联合(union)、追加(append)、融合(dissolve)的用法区别与联系

ArcGIS中,针对矢量数据拼接,有多个工具:合并(merge)、联合(union)、追加(append)、融合(dissolve)等,本文以甘肃省1:100万县级数据详细讲解以上各个工具的用法、区别和注意事项。 有关合并(merge)、联合(union)、追加(append)、融合(dissolve)等基础操作内…

Singleton

问题&#xff1a;编写一个Singleton类 简单的方式 1 package cn.changb.singleton;2 3 /**4 * 简单的方式:弊端是在并发执行时&#xff0c;14行处可能存在多个实例5 */6 public class SingletonDemo1 {7 private static SingletonDemo1 INSTANCE;8 9 private Singlet…

Flutter之运行提示Could not update files on device: Connection closed before full header was received

1 问题 运行flutter app提示错误如下 Performing hot restart... Syncing files to device MIX 3... Could not update files on device: HttpException: Connection closed before full header was received, uri http://127.0.0.1:65054/-tzvW6oGieQ/ Restarted applicati…

C++ 语法都不会怎么写代码? 03

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。系列教程将会…

自定义dialog弹窗html,自定义H5页面dialog弹窗

弹窗一&#xff1a;样式如下&#xff1a;HTML代码&#xff1a;//弹出窗通知取消确认//遮罩层$(.dialog .content).text(text);$(.dialog, .mark).removeClass(hide);}tipDialog("1111");$(".sure").click(function(){var type $(this).attr(type);if(typeb…

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪…

Winform定时启动

System.Timers.Timer t;int sum 0;int qian;int bai;int shi;int ge;public 测试定时启动(){InitializeComponent();}//1.使用System.Timers.Timer//2.threadThread th;//定义线程private void 测试定时启动_Load(object sender, EventArgs e){textBox1.Text "00.00&quo…

聊一聊容器暂停退出

1背景介绍 最近在写 docker 相关教程&#xff0c;过程中发现容器暂停退出竟然有 docker kill、docker stop 和 docker pause 三种方式&#xff0c;今天就来分析下三者间的区别。2辅助指令 docker top - 查看容器进程docker event - 查看容器相关事件docker stats -…

初学者必看的文章:在VM12中安装 RedHat RHEL7.2  系统的详细步骤:看我如何操纵RHEL系统...

一、开始安装 1&#xff09;新建虚拟机 RHEL7.2 2&#xff09;成功引导系统--开机出现此画面 Install Red Hat EnterpriseLinux 7.2 安装RHLE7.2 操作系统 Test this edia & install RedHat Enterpris…

Flutter之点击按钮打开百度链接

1 需求 点击按钮&#xff0c;打开百度链接 2 代码实现 import package:flutter/material.dart; import package:url_launcher/url_launcher.dart;void main() {runApp(MyApp1()); }class MyApp1 extends StatelessWidget {overrideWidget build(BuildContext context) {return…

用计算机算出你喜欢吃你喜欢的人,Go for it七年级下学期1-12单元(期末复习)句子翻译专练...

Go for it七年级下学期1-12单元(期末复习)句子翻译专练Unit11.你的笔友是哪里人?Where is your _________ _______ _________? ( pe n , pal , from )2.他是澳大利亚人.He is ________ _________. (is, from, Australian)3.他住在哪里?Where __________ he________. (does ,…

因为我的名字特殊大家都是用异样的眼光在看着我 04

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。系列教程将会…

【三维激光扫描】第三章:点云数据采集

第一节 野外扫描方案 为了获取高精度完整的点云数据,工作过程-般包括项目计划制订、 外业数据采集和内业数据处理三个环节。《规程)中指出地面三维激光扫描总体工作流程应包括技术准备与技术设计、控制测量、数据采集、数据预处理、成果制作、质量控制与成果归档。本章首先闸…