热点
全栈站长:Windows服务器运行库与环境搭建实战,reasoning_content:我们要求以全栈站长的口吻写一个关于Windows服务器开发:运行库配置与环境搭建全攻略的标题需要简短精炼,30字以内直接输出标题,不要额外说明nn可能的Windows服务器开发:运行库配置与环境搭建全攻略但字数可能超?数一下:Windows服务器开发:运行库配置与环境搭建全攻略 - 共25个汉字(包括冒号)但可能需要更精炼?或者用全栈站长的口吻,比如全栈站长教你Windows服务器运行库配置与环境搭建但要求是标题,直接围绕主题注意全栈站长的口吻可能带点个人风格nn最好用:Win服务器开发:运行库配置与环境搭建全攻略(16字)或者更完整:Windows服务器开发:运行库配置与环境搭建实战(18字)或者:全栈站长带你搞定Windows服务器运行库与环境(18字)但30字内都可以nn最直接:Windows服务器开发:运行库配置与环境搭建全攻略(25字)符合要求nn注意:要求中写的是以'全栈站长'的口吻,但标题中不一定非要出现全栈站长这个词,口吻可以体现在风格上,比如手把手教、从零搭建等不过为了明确,可以包含比如:全栈站长实战:Windows服务器运行库配置与环境搭建(20字)或者:全栈站长:Windows服务器开发运行库与环境搭建指南(22字)我认为最终输出应该直接给出标题
用户调研大数据:网站框架设计优化全攻略,reasoning_content:我们要求以用户调研专员的口吻,写一个与技术、科技相关,关于[大数据思维下的网站框架设计与优化全攻略]的标题注意:直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn需要体现用户调研专员的身份,同时结合大数据思维、网站框架设计优化口吻可以是调研后的洞察、用户视角等例如:从用户数据看网站框架设计优化攻略 或者 大数据思维揭秘:网站框架优化全攻略 但需要更贴合用户调研专员nn考虑:用户调研专员通常会说用户调研发现、基于用户分析等标题可以如:基于用户调研的大数据网站框架优化指南但字数要控制或者:用户调研揭秘:大数据思维下的网站框架设计优化 可能超30字?数一下:用户调研揭秘:大数据思维下的网站框架设计优化(共20个字?中文字数:用户调研揭秘:大数据思维下的网站框架设计优化 算标点?要求字数控制30字以内,没问题但更精炼nn或者:大数据思维:用户调研视角的网站框架优化全攻略 但全攻略可能太长也可以直接:大数据思维下的网站框架设计优化方案 但缺少用户调研专员口吻nn更佳:用户调研数据分析:网站框架优化全攻略 但缺少大数据思维或者:从用户数据出发:网站框架设计优化全攻略 也是nn最终决定:用户调研专员的视角:大数据思维下的网站框架优化 字数?用户调研专员的视角:大数据思维下的网站框架优化(共19字)但全攻略没体现可以加全攻略变成用户调研专员的网站框架优化全攻略 有点偏离大数据思维nn更好的:大数据思维下的网站框架优化:用户调研专员的实战攻略 超了?数一下:大数据思维下的网站框架优化:用户调研专员的实战攻略(共21字,包括冒号)可以nn但要求是直接输出一个标题,我选择最合适的考虑到用户调研专员的口吻,可以用用户调研 | 大数据思维下的网站框架设计与优化全攻略 但竖线可能不太合适nn简洁一点:基于用户调研的大数据网站框架优化指南 共19字这个不错nn或者:用户调研大数据:网站框架设计与优化全攻略 共17字nn我决定用:用户调研大数据:网站框架设计优化全攻略 共17字,含冒号注意全攻略是原题中的这样比较贴切nn再检查:用户调研专员的口吻,要求与技术、科技相关,大数据思维这个标题直接点明用户调研和大数据,符合nn所以输出这个
Linux数据库高效运行环境搭建策略与实施指南,reasoning_content:我们要求以系统维护员的口吻,写一个与“技术、科技”相关,关于[Linux数据库高效运行环境搭建策略与实施指南]的标题输出一个标题,不要加说明简短精炼,30字以内nn注意:口吻是系统维护员,标题要体现技术、科技,内容关于Linux数据库高效运行环境搭建策略与实施指南可以写比如:“Linux数据库高效环境搭建:维护员实战策略”之类的但需要更精炼考虑到30字限制,可以写:“Linux数据库高效运行环境搭建策略与实施指南”但可能超出?数一下:Linux数据库高效运行环境搭建策略与实施指南 共22个汉字?实际是:Linux(5字母但算一个词) 数据库(3字) 高效(2) 运行(2) 环境(2) 搭建(2) 策略(2) 与(1) 实施(2) 指南(2) 总共?汉字部分:数据库高效运行环境搭建策略与实施指南 共16个汉字?算上Linux是英文,但通常标题中英文算一个单词总字符数:Linux(5) + 空格?其实通常写为“Linux数据库高效运行环境搭建策略与实施指南” 中英文混合字数限制通常指汉字字数,但30字以内,16个汉字没问题但要求简短精炼,或许可以更短或者用“系统维护员:Linux数据库高效环境搭建指南” 等等但需要体现“策略与实施”最好直接给出一个标题nn我提供:Linux数据库高效运行环境搭建策略与实施指南 这个正好或者为了更符合口吻,加个“维护员”:“维护员视角:Linux数据库高效环境搭建策略” 但字数可能差不多nn直接输出:Linux数据库高效运行环境搭建策略与实施指南 这个我认为可以
17 9 月 2026, 周四

IOS开发之UIScrollView实现图片轮播器的无限滚动

IOS开发之UIScrollView实现图片轮播器的无限滚动

简介

在现在的一些App中常常见到图片轮播器,一般用于展示广告、新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能。

轮播原理

UIScrollView对象有pagingEnable成员,如果设置为YES,那么每一个scrollView尺寸这么大的区域就会被当作一页,在滚动时会根据滚动的比例自动计算应该切换到哪一页。

无限滚动原理

要实现无限滚动,需要额外的两张图片,假设我们的图片有五张,存在images数组中,那么我们在将图片插入到scrollView中时,在第一张图片前面插入一个最后一张图片作为辅助图片,在最后一张后面插入一个第一张图片作为辅助图片。这样,当滚动到第一张前面一张时,在页面切换结束后无动画的切换scrollView的偏移量为最后一张图片(不包含最后一张后面的第一张那个辅助图片),这样就实现了由辅助图片到真实图片的过渡,之所以设置辅助图片是为了在滚动中看到那个真实图片。同理,当滚动到最后一张的后面一张时,我们吧scrollView的偏移量设置为第一张图片即可。

具体的代码实现

这个代码是在开发一个项目中所写的,已经封装称一个View,只需要调用initWithFrame指定轮播器尺寸,然后通过设置images成员的值即可实现无限滚动的轮播。

// .h
//
// ESPicPageView.h
// 享技
//
// Created by 11 on 11/30/15.
// Copyright © 2015 soulghost. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ESPicPageView : UIView

@property (nonatomic,strong) NSArray *images;

@end
// --------------------------------------------
// .m
//
// ESPicPageView.m
// 享技
//
// Created by 11 on 11/30/15.
// Copyright © 2015 soulghost. All rights reserved.
//

#import "ESPicPageView.h"
#import "UIImageView+WebCache.h"

@interface ESPicPageView () <UIScrollViewDelegate>

@property (nonatomic,weak) UIScrollView *scrollView;
@property (nonatomic,weak) UIPageControl *pageControl;
@property (nonatomic,assign) CGFloat imgW;
@property (nonatomic,assign) CGFloat imgH;
@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,strong) NSArray *imageViews;
@property (nonatomic,assign) NSInteger imageCount;

@end

@implementation ESPicPageView

- (instancetype)initWithFrame:(CGRect)frame{

  if (self = [super initWithFrame:frame]) {

    self.backgroundColor = [UIColor blueColor];
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    self.scrollView = scrollView;
    self.scrollView.delegate = self;
    self.scrollView.pagingEnabled = YES;
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.backgroundColor = [UIColor whiteColor];
    [self addSubview:scrollView];
    self.imgW = frame.size.width;
    self.imgH = frame.size.height;
    [self setNeedsLayout];

    UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(frame.size.width - 50,frame.size.height - 10,0)];
    self.pageControl = pageControl;
    self.pageControl.numberOfPages = 1;
    [self addSubview:pageControl];

    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

  }

  return self;

}

- (void)nextImage{
  NSInteger page = self.pageControl.currentPage;
  page = self.pageControl.currentPage + 1;
  CGPoint offset = CGPointMake((1 + page) * self.imgW,0);
  [self.scrollView setContentOffset:offset animated:YES];
}

- (void)setupImageViews{

  for (int i = 0; i < self.images.count + 2; i++) {
    UIImageView *imageView = [[UIImageView alloc] init];
    CGFloat imageX = i * self.imgW;
    CGFloat imageY = 0;
    CGFloat imageW = self.imgW;
    CGFloat imageH = self.imgH;
    imageView.frame = CGRectMake(imageX,imageY,imageW,imageH);
    [self.scrollView insertSubview:imageView atIndex:0];
  }

}

- (NSArray *)imageViews{

  if (_imageViews == nil) {
    NSMutableArray *arr = [NSMutableArray array];
    for (int i = 0; i < self.images.count + 2; i++) {
      UIImageView *imageView = [[UIImageView alloc] init];
      CGFloat imageX = i * self.imgW;
      CGFloat imageY = 0;
      CGFloat imageW = self.imgW;
      CGFloat imageH = self.imgH;
      imageView.frame = CGRectMake(imageX,imageH);
      [self.scrollView insertSubview:imageView atIndex:0];
      [arr addObject:imageView];
    }
    _imageViews = arr;
  }

  return _imageViews;

}

- (void)setImages:(NSArray *)images{

  _images = images;
  self.imageCount = images.count;
  self.pageControl.numberOfPages = self.imageCount;
  [self addPics];

}

- (void)addPics{

  for (int i = 0; i < self.images.count + 2; i++) {
    UIImageView *imageView = self.imageViews[i];
    if (i == 0) {
      imageView.image = [self.images lastObject];
    }else if(i == self.images.count + 1){
      imageView.image = [self.images firstObject];
    }else{
      imageView.image = self.images[i - 1];
    }
  }

}

- (void)layoutSubviews{

  [super layoutSubviews];
  self.scrollView.frame = self.bounds;
  self.scrollView.contentSize = CGSizeMake((self.imageCount + 2) * self.imgW,0);
  [self.scrollView setContentOffset:CGPointMake(self.imgW,0) animated:NO];

}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

  [self.timer invalidate];
  self.timer = nil;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

  self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
  [[NSRunLoop currentRunLoop ] addTimer:self.timer forMode:NSRunLoopCommonModes];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

  if (scrollView.contentOffset.x == self.imgW * (self.imageCount + 1)) {
    [self.scrollView setContentOffset:CGPointMake(self.imgW,0) animated:NO];
  }else if(scrollView.contentOffset.x == 0){
    [self.scrollView setContentOffset:CGPointMake(self.imgW * (self.imageCount),0) animated:NO];
  }

  self.pageControl.currentPage = (self.scrollView.contentOffset.x + self.imgW * 0.5f) / self.imgW - 1;

}

@end

以上就是使用UIScrollView实现图片的轮播的功能,如有疑问大家可以留言,也可以到本站社区留言讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

dawei

【声明】:乐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

全栈站长:Windows服务器运行库与环境搭建实战,reasoning_content:我们要求以全栈站长的口吻写一个关于Windows服务器开发:运行库配置与环境搭建全攻略的标题需要简短精炼,30字以内直接输出标题,不要额外说明nn可能的Windows服务器开发:运行库配置与环境搭建全攻略但字数可能超?数一下:Windows服务器开发:运行库配置与环境搭建全攻略 - 共25个汉字(包括冒号)但可能需要更精炼?或者用全栈站长的口吻,比如全栈站长教你Windows服务器运行库配置与环境搭建但要求是标题,直接围绕主题注意全栈站长的口吻可能带点个人风格nn最好用:Win服务器开发:运行库配置与环境搭建全攻略(16字)或者更完整:Windows服务器开发:运行库配置与环境搭建实战(18字)或者:全栈站长带你搞定Windows服务器运行库与环境(18字)但30字内都可以nn最直接:Windows服务器开发:运行库配置与环境搭建全攻略(25字)符合要求nn注意:要求中写的是以'全栈站长'的口吻,但标题中不一定非要出现全栈站长这个词,口吻可以体现在风格上,比如手把手教、从零搭建等不过为了明确,可以包含比如:全栈站长实战:Windows服务器运行库配置与环境搭建(20字)或者:全栈站长:Windows服务器开发运行库与环境搭建指南(22字)我认为最终输出应该直接给出标题

用户调研大数据:网站框架设计优化全攻略,reasoning_content:我们要求以用户调研专员的口吻,写一个与技术、科技相关,关于[大数据思维下的网站框架设计与优化全攻略]的标题注意:直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn需要体现用户调研专员的身份,同时结合大数据思维、网站框架设计优化口吻可以是调研后的洞察、用户视角等例如:从用户数据看网站框架设计优化攻略 或者 大数据思维揭秘:网站框架优化全攻略 但需要更贴合用户调研专员nn考虑:用户调研专员通常会说用户调研发现、基于用户分析等标题可以如:基于用户调研的大数据网站框架优化指南但字数要控制或者:用户调研揭秘:大数据思维下的网站框架设计优化 可能超30字?数一下:用户调研揭秘:大数据思维下的网站框架设计优化(共20个字?中文字数:用户调研揭秘:大数据思维下的网站框架设计优化 算标点?要求字数控制30字以内,没问题但更精炼nn或者:大数据思维:用户调研视角的网站框架优化全攻略 但全攻略可能太长也可以直接:大数据思维下的网站框架设计优化方案 但缺少用户调研专员口吻nn更佳:用户调研数据分析:网站框架优化全攻略 但缺少大数据思维或者:从用户数据出发:网站框架设计优化全攻略 也是nn最终决定:用户调研专员的视角:大数据思维下的网站框架优化 字数?用户调研专员的视角:大数据思维下的网站框架优化(共19字)但全攻略没体现可以加全攻略变成用户调研专员的网站框架优化全攻略 有点偏离大数据思维nn更好的:大数据思维下的网站框架优化:用户调研专员的实战攻略 超了?数一下:大数据思维下的网站框架优化:用户调研专员的实战攻略(共21字,包括冒号)可以nn但要求是直接输出一个标题,我选择最合适的考虑到用户调研专员的口吻,可以用用户调研 | 大数据思维下的网站框架设计与优化全攻略 但竖线可能不太合适nn简洁一点:基于用户调研的大数据网站框架优化指南 共19字这个不错nn或者:用户调研大数据:网站框架设计与优化全攻略 共17字nn我决定用:用户调研大数据:网站框架设计优化全攻略 共17字,含冒号注意全攻略是原题中的这样比较贴切nn再检查:用户调研专员的口吻,要求与技术、科技相关,大数据思维这个标题直接点明用户调研和大数据,符合nn所以输出这个