热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iosUIScrollView循环滑动

demo地址1:http:download.csdn.netdetailtake86197024767432demo地址2:http:download.csdn.netdetail

demo地址 1:   http://download.csdn.net/detail/take8619702/4767432

demo地址 2:   http://download.csdn.net/detail/take8619702/4767443

demo地址 3:   http://download.csdn.net/detail/take8619702/4767459

1.普通分页滑动

    myScrollView = [[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,320,460)];

    [myScrollViewsetContentSize:CGSizeMake(pageWidth*3,460)];

    [myScrollViewsetBackgroundColor:[UIColorscrollViewTexturedBackgroundColor]];

    [myScrollViewsetPagingEnabled:YES];//当此属性设置为YES时,才能自动分页

    [self.viewaddSubview:myScrollView];

2.循环滑动

  • 实现UIScrollViewDelegate代理:  [myScrollViewsetDelegate:self];
  • 初始化时,myScrollView 置于中间: [myScrollView setContentOffset:CGPointMake(pageWidth0)]
  • 滑动结束之后,回到中间:  [myScrollViewsetContentOffset:CGPointMake(pageWidth,0)];
  • 代理方法:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    {

        if (scrollView.contentOffset.x <&#61;0) {

            [scrollView setContentOffset:CGPointMake(pageWidth,0)];

        }

        if (scrollView.contentOffset.x >&#61;2*pageWidth) {

            [scrollView setContentOffset:CGPointMake(pageWidth,0)];

        }

        

    }

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

    {

        [scrollView setContentOffset:CGPointMake(pageWidth,0)animated:YES];

    }

3.加上图片查看效果

    这两句的位置不能交换

    [selfloadScrollViewSubViews];

    [myScrollViewsetContentOffset:CGPointMake(pageWidth,0)];

- (void)loadScrollViewSubViews

{

    imageView1 &#61; [[UIImageViewalloc]initWithImage:[UIImageimageNamed:&#64;"1.jpg"]];

    imageView2 &#61; [[UIImageViewalloc]initWithImage:[UIImageimageNamed:&#64;"2.jpg"]];

    imageView3 &#61; [[UIImageViewalloc]initWithImage:[UIImageimageNamed:&#64;"3.jpg"]];

    

    [imageView1 setFrame:CGRectMake(         0,0pageWidth,460)];

    [imageView2 setFrame:CGRectMakepageWidth,0,pageWidth,460)];

    [imageView3 setFrame:CGRectMake(2*pageWidth,0,pageWidth,460)];

    

    [myScrollView addSubview:imageView1];

    [myScrollView addSubview:imageView2];

    [myScrollView addSubview:imageView3];

}

4.循环效果并未出现&#xff0c;还要加上交换图片的代码

- (void)previousImageViewWithImage

{

    UIImage * temp &#61; [imageView1.imageretain];

    imageView1.image &#61;imageView2.image;

    imageView2.image &#61;imageView3.image;

    imageView3.image &#61; temp;

    [temp release];

}


- (void)nextImageViewWithImage

{

    UIImage * temp &#61; [imageView3.imageretain];

    imageView3.image &#61;imageView2.image;

    imageView2.image &#61;imageView1.image;

    imageView1.image &#61; temp;

    [temp release];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    if (scrollView.contentOffset.x <&#61;0) {

        currentImageCount--;

        [selfpreviousImageViewWithImage];

        [scrollView setContentOffset:CGPointMake(pageWidth,0)];

    }

    if (scrollView.contentOffset.x >&#61;2*pageWidth) {

        currentImageCount&#43;&#43;;

        [selfnextImageViewWithImage];

        [scrollView setContentOffset:CGPointMake(pageWidth,0)];

    }

    

}



5.完美的ScrollView循环

为什么UIImage * temp &#61; [imageView3.image retain];在此处需要retain&#xff0c;如果不加此句&#xff0c;按home键之后&#xff0c;再回到程序滑动&#xff0c;程序会crash。

感谢Eric yang&#xff08;对于此问题的解答&#xff09;


为了显示效果&#xff0c;去掉进度条。


进阶一&#xff1a;

1.知道当前所指向图片

给程序增加计数器&#xff0c;指向当前图片。

int currentImageCount;

初始化为33333331&#xff0c;跟上面的第2点同步。&#xff08;为了取模3的值&#xff0c;所以不是1&#xff0c;而是33331&#xff0c;随便几个3&#xff09;


2.如果向后滑动&#xff0c;currentImageCount&#43;&#43;;

   如果向前滑动&#xff0c;currentImageCount--;


3.为了防止回滑多次&#xff0c;乱成图片&#xff0c;程序混乱

所以还需要增加判断&#xff0c;在&#xff1a;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

if (currentImageCount &#61;&#61; 0) {

    currentImageCount &#61; 33333330;

}


4.给myScrollView一个tap事件&#xff0c;点击图片&#xff0c;弹出当前图片计数&#xff08;理论计数&#xff09;

- (void)addTapEventOnMyScrollView

{

    tap &#61; [[UITapGestureRecognizeralloc]initWithTarget:selfaction:&#64;selector(tapEvent)];

    [myScrollViewaddGestureRecognizer:tap];

}


- (void)tapEvent

{

    NSString * strMsg &#61; [NSStringstringWithFormat:&#64;"当前图片理论计数:%i",curentImage];

    UIAlertView * alert &#61; [[UIAlertViewalloc]initWithTitle:&#64;"图片计数" message:strMsgdelegate:nilcancelButtonTitle:&#64;"确定"otherButtonTitles:nil];

    [alert show];

    [alert release];

}


5.增加一个pageControl,直观显示当前滑动

- (void)addMyPageControl

{

    myPageControl &#61; [[UIPageControlalloc]initWithFrame:CGRectMake(110,420,100,20)];

    [myPageControlsetNumberOfPages:3];

    [myPageControl setCurrentPage:curentImage];

    [self.viewaddSubview:myPageControl];

}


进阶二&#xff1a;

1.增加定时器&#xff0c;图片自动滑动

- (void)addAutoTimer

{

    myAutoTimer &#61; [NSTimerscheduledTimerWithTimeInterval:5.0target:selfselector:&#64;selector(autoChangeScrollView)userInfo:nilrepeats:YES];

}

- (void)autoChangeScrollView

{

    [myScrollViewsetContentOffset:CGPointMake(2*pageWidth,0)animated:YES];

}

2.为了pageControl&#xff0c;与tap事件连接&#xff0c;修攺autoChangeScrollView

- (void)autoChangeScrollView

{

    [myScrollViewsetContentOffset:CGPointMake(2*pageWidth,0)animated:YES];

}

3.开始手动滑动时&#xff0c;停止定时器&#xff0c;手动滑动结束后停止定时器

- (void)stopAutoTimer

{

    if (myAutoTimer) {

        [myAutoTimer invalidate];

        myAutoTimer &#61; nil;

    }

}


- (void)restartAutoTimer

{

    if (!myAutoTimer) {

        [self addAutoTimer];

    }

}


4.如果用户向后滑动&#xff0c;则自动向后滑动。如果用户向前滑动&#xff0c;则自动向前滑动。增加滑动方向布尔

BOOL isGoBefor;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    if (scrollView.contentOffset.x <&#61;0) {

        isGoBefor &#61; YES;

    }

    if (scrollView.contentOffset.x >&#61;2*pageWidth) {

        isGoBefor &#61; NO;

    }

}


自动切换函数

- (void)autoChangeScrollView

{

    if (isGoBefor) {

        [myScrollViewsetContentOffset:CGPointMake(0,0)animated:YES];

    } else {

        [myScrollViewsetContentOffset:CGPointMake(2*pageWidth,0)animated:YES];

    }

}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    if (scrollView.contentOffset.x <&#61;0) {

        isGoBefor &#61; YES;

        currentImageCount--;

        

        curentImage &#61; currentImageCount%3;

        //----------------------------------------------------------------------------------------------增加PageControl直观显示当前滑动位置

        [myPageControl setCurrentPage:curentImage];

        

        [selfpreviousImageViewWithImage];

        [scrollView setContentOffset:CGPointMake(pageWidth,0)];

    }

    if (scrollView.contentOffset.x >&#61;2*pageWidth) {

        isGoBefor &#61; NO;

        currentImageCount&#43;&#43;;

        

        curentImage &#61; currentImageCount%3;

        //----------------------------------------------------------------------------------------------增加PageControl直观显示当前滑动位置

        [myPageControl setCurrentPage:curentImage];

        

        [selfnextImageViewWithImage];

        [scrollView setContentOffset:CGPointMake(pageWidth,0)];

    }

}



推荐阅读
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • http:oj.leetcode.comproblemsminimum-depth-of-binary-tree贡献了一次runtimeerror,因为如果输入为{}即空的时候,出 ... [详细]
  • 无限_iOS无限轮播视图
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS无限轮播视图相关的知识,希望对你有一定的参考价值。  以前曾经写过一个用UICollectionView的无限轮播 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
手机用户美佛_885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有