iOS开发---轮播图模块(连续循环滚动版)
来源:互联网 发布:淘宝首页设计一套多钱 编辑:程序博客网 时间:2024/06/14 21:56
// 基于ScrollView的轮播模块,循环滚动// ViewController.m// Slider-轮播-循环滚动版//// Created by JamesXiang on 15/7/25.// Copyright (c) 2015年 JamesXiang. All rights reserved.//#import "ViewController.h"@interface ViewController () <UIScrollViewDelegate>@property (nonatomic, strong) UIScrollView *scrollView;@property (nonatomic, strong) UIPageControl *pageControl;@property (nonatomic, strong) NSTimer *timer;@property (nonatomic, assign) int pageIndex;@property (nonatomic, assign) int pageCount;@property (nonatomic, assign) double sliderWidth;@property (nonatomic, assign) double sliderHeight;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; [self loadSlider]; // 轮播总入口}- (void)loadSlider { // 设置相关参数 [self setParams]; // 加载轮播容器 [self loadSliderContainer]; // 加载轮播内容 [self loadSliderItem]; // 加载轮播页码控制器 [self loadSliderPageControl]; // 轮播开始 [self sliderBegin];}- (void)setParams { // 设置页码为0 self.pageIndex = 0; // 轮播内容个数为5 self.pageCount = 5; // 设置轮播器高度为160 self.sliderHeight = 160; // 设置轮播器宽度为屏幕宽度 self.sliderWidth = self.view.frame.size.width;}- (void)loadSliderContainer { UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, self.sliderWidth, self.sliderHeight)]; scrollView.delegate = self; scrollView.pagingEnabled = YES; scrollView.showsHorizontalScrollIndicator = NO; // 设置contentSize scrollView.contentSize = CGSizeMake(self.sliderWidth * (self.pageCount + 2), self.sliderHeight); // 设置初始offset,左右都可连续滚动的基础 scrollView.contentOffset = CGPointMake(self.sliderWidth, 0); scrollView.backgroundColor = [UIColor whiteColor]; _scrollView = scrollView; [self.view addSubview:_scrollView];}- (void)loadSliderItem { // 循环轮播原理: // 需要轮播的内容为 slider0,slider1,slider2,slider3,slider4 // scrollView中实际内容 slider4-b,slider0,slider1,slider2,slider3,slider4,slider0-b // 这样构造的目的是当达到最前边或者最后边时能够以自然滚动的方式过度到下一个页面 // slider0-b的作用: // 当过度slider0-b时,修改scrollView的contentOffset,完成连续滚动 // 例:当滚动到slider4时,继续滚动到slider0-b,滚动完毕,这时 // 通过修改contentOffset使scrollView把处于第一个位置的slider0显示出来,然后继续向右滚动至slider1,连续滚动 // slider4-b的作用: // 当完成一轮滚动时,重新回到slider0时,通过人工拖拽向右挪动手指,如果没有slider4-b,则会导致无法拉动 // 有了slider4-b,就算向左拉动仍然会有内容显示 // 具体的移动策略见 updateLocation 方法 for (int i = 0; i < self.pageCount + 2; i++) { UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(self.sliderWidth * i, 0, self.sliderWidth, self.sliderHeight)]; // 打开imageView的用户交互开关,允许与用户交互 [imgView setUserInteractionEnabled:YES]; [imgView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderClick)]]; if (i == 0) { imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"slider%d.jpg", self.pageCount-1]]; }else if(i == self.pageCount + 1) { imgView.image = [UIImage imageNamed:@"slider0.jpg"]; }else { imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"slider%d.jpg", i - 1]]; } [self.scrollView addSubview:imgView]; }}- (void)sliderClick { NSLog(@"点击事件...用户点击了第 %d 张图片,请做出回应", self.pageIndex);}- (void)loadSliderPageControl { UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, self.sliderHeight, self.sliderWidth, 20)]; pageControl.numberOfPages = self.pageCount; pageControl.currentPage = self.pageIndex; _pageControl = pageControl; [self.view addSubview:_pageControl];}- (void)sliderBegin { self.timer = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(changeSlider) userInfo:nil repeats:YES];}- (void)changeSlider { self.pageIndex++; if (self.pageIndex == self.pageCount) { self.pageIndex = 0; } [UIView animateWithDuration:0.8 animations:^{ self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x + self.sliderWidth, 0); } completion:^(BOOL finished) { self.pageControl.currentPage = self.pageIndex; }]; // 更新页面index和特殊位置位移 [self updateIndexAndSpecialLocation];}// 代理方法,当开始手动拉拽时- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.timer invalidate];}// 代理方法,当手动拉拽滚动完毕后- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self updateIndexAndSpecialLocation]; self.pageControl.currentPage = self.pageIndex; [self sliderBegin];}- (void)updateIndexAndSpecialLocation { int index = self.scrollView.contentOffset.x / self.sliderWidth; if (index == 0) { // 当目前显示的是slider4-b页面时 self.pageIndex = self.pageCount - 1; // 修改offset,使后边的slider4显示出来 self.scrollView.contentOffset = CGPointMake(self.sliderWidth * self.pageCount, 0); }else if(index == self.pageCount + 1) { // 当目前显示的是slider0-b页时 // 修改offset,使前边的slider0显示出来 self.scrollView.contentOffset = CGPointMake(self.sliderWidth, 0); self.pageIndex = 0; }else { self.pageIndex = index-1; }}@end
0 0
- iOS开发---轮播图模块(连续循环滚动版)
- 图片连续循环滚动代码(向上)
- iOS 连续滚动图片
- 图片连续循环滚动代码
- iOS开发-------滚动视图(UIScrollView)并实现循环滚动
- iOS开发---轮播图模块(普通版)
- [js] 图片无缝连续循环滚动(转)
- 图片连续循环滚动代码(向上、下、左、右)
- 图片连续循环滚动代码(向上、下、左、右)
- 图片连续循环滚动代码(向上、下、左、右)
- iOS开发 ----- 自动循环滚动或引导页效果
- iOS开发之自定义视图上下无限循环滚动实现
- ios开发连续手机震动(kSystemSoundID_Vibrate连续震动)
- iOS UISCrollView循环滚动 实现
- iOS 循环滚动的UIScrollView
- iOS UIScrollView 循环滚动(loop)
- iOS uiscrollview 自动循环滚动
- iOS UISCrollView循环滚动 实现
- leetcode 76: Minimum Window Substring
- sendmessage 用法
- USACO 2.2.2 Subset Sums
- C/C++经典算法精华整理(3)-实现栈的数据结构
- brackets 禁用JSLint 使用JShint 插件和同时分屏编辑html+css+js
- iOS开发---轮播图模块(连续循环滚动版)
- 虚拟化项目之运维实践 4
- 网络编程系列之十 自动生成makefile
- 通过iframe上传即预览
- 在ubuntu 14.04上编译android 5.0.2源码
- 京东DNN Lab首席科学家:用深度学习搞定80%的客服工作
- HDOJ 5352 MZL's City 匈牙利匹配
- socket 实现多线程聊天
- WaitForSingleObject等待的时间精度测试