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…

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;请大家纠正我。下面是其中的一个例…

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…

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…

聊一聊容器暂停退出

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…

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

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

undefined reference to 问题解决方法

最近在Linux下编程发现一个诡异的现象&#xff0c;就是在链接一个静态库的时候总是报错&#xff0c;类似下面这样的错误&#xff1a; (.text0x13): undefined reference to func 关于undefined reference这样的问题&#xff0c;大家其实经常会遇到&#xff0c;在此&#xff0c…

WPF 实现扇形统计图

扇形统计图原文作者&#xff1a;ArcherSong博客地址&#xff1a;https://www.cnblogs.com/ganbei/绘制一个扇形原理也是基于Canvas进行绘制;ArcSegment[1]绘制弧形;绘制指示线&#xff1b;绘制文本&#xff1b;鼠标移入动画&#xff1b;显示详情Popup&#xff1b;源码Github[2]…

Flutter之测试Http和HttpClient

1 测试Http和HttpClient 导入包&#xff1a;在pubspec.yaml里面导入 http: ^0.12.2 main.dart里面导入 import package:http/http.dart as http; import dart:convert; import dart:io; 2 代码实现 import package:flutter/material.dart; import package:url_launcher/url_lau…

基于zookeeper的solrCloud集群搭建

1.安装及搭建相关环境 1.1环境准备 centos7,jdk1.8,tomcat8,zookeeper3.4.X,solr4.10.X 链接: https://pan.baidu.com/s/1i47IuKd 密码: emqt 2.zookeeper集群搭建 2.1复制zookeeper [rootMiWiFi-R3-srv ~]# mkdir /usr/local/solr-cloud [rootMiWiFi-R3-srv ~]# cp -r zookee…

【小白必懂】C语言求完全数

注意&#xff1a;学生党如果存在付费问题可以加我好友&#xff0c;我可以开单篇短时间的免费哟~ 私聊我就好~ 情景再现 &#x1f478;小媛&#xff1a;小C&#xff0c;你知道什么是完全数吗&#xff1f; &#x1f430;小C&#xff1a;知道呀&#xff0c;难道是今天老师又出题…

台式计算机硬件输入设备,台式电脑硬件配置有哪些

台式电脑硬件配置你知道有哪些?电脑的配置一般是指电脑的硬件配件的高档程度、性价比等&#xff0c;电脑的性能好坏主要决定于以下主要硬件配置。一起来看看台式电脑硬件配置有哪些&#xff0c;欢迎查阅!组装台式电脑配置1、实用性机型建议&#xff1a;首选1&#xff1a;intel…

Android WebView和JavaScript交互

JavaScript在现在的网页设计中用得很多&#xff0c;Android 的WebView可以载入网页&#xff0c;WebView也设计了与JavaScript通信的桥梁。这篇主要介绍一下WebViewk控件如何和JavaScript进行交互。 WebView: WebView和网页相关的主要有一下几个方法&#xff1a;  setWebViewCl…