在项目中把banner图片UIImageView一张一张的放入UIScrollView中,通过设置UIScrollView的pagingEnabled属性为YES,则可以做到当用户滑动banner时图片一张一张的显示,但当用户想从第一张图到最后一张图,或者从最后一张图到第一张图的时候就会卡住,简单点的做法就是判断用户swipe的方向,然后让UIScrollView自动滑动到最后一张或者第一张,这样做在动画中又显得不够自然,一下是解决办法

  假设banner图片有3张,在banner的UIScrollView中用以下的方式进行排列

第三张 第一张 第二张 第三张 第一张

UIScrollView默认滚动到第二张图片的位置,当用户滑动到第一张时,则UIScrollView自动滚动到第4张去,同理当用户滑动到最后一张时,UIScrollView自动滚动到第二张去,这些滚动都设置动画效果为NO

代码如下

h文件

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

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

m文件

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>
{
CGFloat w;
NSMutableArray *imgArr;
NSMutableArray *pageArr;
} @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
w = self.view.frame.size.width;
//page的个数
pageArr = [NSMutableArray array];
for (int i = ; i <= ; i++) {
[pageArr addObject:[NSString stringWithFormat:@"%d.jpg",i]];
}
//重新获取imgView的个数,将显示的第最后一张图片放在第一张,而在最后一张放置显示的第一张图片
imgArr = [NSMutableArray array];
[imgArr addObject:pageArr[pageArr.count - ]];
for (NSString *imgSrc in pageArr) {
[imgArr addObject:imgSrc];
}
[imgArr addObject:pageArr[]];
self.mainScroll.contentSize = CGSizeMake(w*imgArr.count, );
//开始塞入图片
for (int i = ; i < imgArr.count; i++) {
NSString *imgSrc = imgArr[i];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(i*w, , w, self.mainScroll.frame.size.height)];
[imgView setImage:[UIImage imageNamed:imgSrc]];
[self.mainScroll addSubview:imgView];
}
self.pageControl.numberOfPages = pageArr.count;
self.mainScroll.bounces = NO;
self.mainScroll.pagingEnabled = YES;
self.mainScroll.showsHorizontalScrollIndicator = NO;
self.mainScroll.showsVerticalScrollIndicator = NO;
self.mainScroll.delegate = self;
//自动将scrollView移动显示的第一张图片处
[self.mainScroll setContentOffset:CGPointMake(w, ) animated:NO];
} - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGFloat offsetX = scrollView.contentOffset.x;
int index = offsetX/w;
if (index == ) {
[self.mainScroll setContentOffset:CGPointMake(w*(imgArr.count-), ) animated:NO];
self.pageControl.currentPage = pageArr.count - ;
}else if (index == imgArr.count -){
[self.mainScroll setContentOffset:CGPointMake(w, ) animated:NO];
self.pageControl.currentPage = ;
}else{
self.pageControl.currentPage = index - ;
} } @end

IOS 实现banner循环轮播的更多相关文章

  1. Android无限循环轮播广告位Banner

     Android无限循环轮播广告位Banner 现在一些app通常会在头部放一个广告位,底部放置一行小圆圈指示器,指示广告位当前的页码,轮播展示一些图片,这些图片来自于网络.这个广告位banner ...

  2. 解析SwiftUI布局细节(二)循环轮播+复杂布局

    前言 上一篇我们总结的主要是VStack里面的东西,由他延伸到 @ViewBuilder, 接着我们上一篇总结的我们这篇内容主要说的是下面的几点,在这些东西说完后我准备解析一下苹果在SiwftUI文档 ...

  3. swiper在vue项目中的循环轮播bug以及点击事件

    一般的,如果是静态数据(本地数据),可以直接在mounted生命周期中初始化,循环轮播.自动播放都比较正常. 但是,如果是动态从后台获取数据的话,采用上述方法会发现,轮播图无法自动播放,也无法拖拽. ...

  4. 网站banner无缝轮播

    网站banner无缝轮播 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  5. js 实现图片间隔循环轮播以及没有间隔的循环轮播

    链接地址:http://blog.sina.com.cn/s/blog_75cf5f32010199dn.html 最近做了个图片循环轮播的功能.就是几张图片不断的循环滚动显示. 感觉这个方法不错所以 ...

  6. 超级详细 一听就会:利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)

    前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...

  7. 解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。

    问题描述: 1.我使用axios异步请求后台的图片进行渲染后不能实现循环轮播,也就是loop失效,但是静态写死的情况下不会出现这种问题. 2. 分析: swiper的机制是:初始化的时候将swiper ...

  8. 非常简单的方法实现ViewPager自动循环轮播

    非常简单的方法实现ViewPager自动循环轮播,见红色代码部分,其它的代码可以忽略不看. 简洁高效是我解决问题的首要出发点. package com.shuivy.happylendandreadb ...

  9. 利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载

    前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...

随机推荐

  1. 写出完美的snprintf

    平时公司的代码安全扫描会给出不安全代码的告警,其中会检查代码中间的strcpy和sprintf函数,而要求使用strncpy和snprintf.今天我们讨论一下怎样写出完美的snprintf. snp ...

  2. Java之Filter

    一.何为Filter? Filter也称之为过滤器,它是Servlet技术中比較激动人心的技术.WEB开发者通过Filter技术.对webserver管理的全部web资源.换句话说其主要用于前台向后台 ...

  3. 你可能不知道的5个功能强大的 HTML5 API

    HTML5 新增了许多重要的特性,像 video.audio 和 canvas 等等,这些特性使得能够很容易的网页中包含多媒体内容,而不需要任何的插件或者 API.而其它的新元素,例如 section ...

  4. 9.接口BeanPostProcessor

    package org.springframework.beans.factory.config; import org.springframework.beans.BeansException; p ...

  5. Linux项目部署发布

    Linux项目部署发布 1.部署环境准备,准备python3和虚拟环境解释器,virtualenvwrapper pip3 install -i https://pypi.douban.com/sim ...

  6. linux c编程:信号(三) sigprocmask和sigpending函数

    信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依 ...

  7. ABAP 发邮件(三)

    [转自http://blog.sina.com.cn/s/blog_7c7b16000101bnxk.html]SAP ABAP 发邮件方法三(OO) *&------------------ ...

  8. 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP透传模式传输数据流步骤

    测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...

  9. Django模型系统——ORM

    一.概论 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描 ...

  10. UIImageView 获取图片的 宽 高

    该文章纯属这两天开发的经验之谈 并且也是平常没注意 这回发现的一个小方法 并且很实用 在开发中 提高了很大的效率 更加符合高保真的要求 通常 美术 切的一些图片 需要 :1还原的 现在 我们一般支持i ...