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.pswp.cn/news/287046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287046.shtml
英文地址,請注明出處:http://en.pswp.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;迷茫的你會找到答案。系列教程將會…

【三維激光掃描】第三章:點云數據采集

第一節 野外掃描方案 為了獲取高精度完整的點云數據,工作過程-般包括項目計劃制訂、 外業數據采集和內業數據處理三個環節。《規程)中指出地面三維激光掃描總體工作流程應包括技術準備與技術設計、控制測量、數據采集、數據預處理、成果制作、質量控制與成果歸檔。本章首先閘…