UIScrollView和UIPageControl结合实现图片浏览

iOS中具有图片类的app通常都会有滑动浏览的功能,许多app第一次启动时,也会用UIScrollView+UIPageControl来展示新功能。今天探索一下如何实现该功能。

首先介绍下UIScrollView, UIScrollView中有个重要的属性是contentSize,用于界定滑动范围的大小。UIScrollView本身frame是我们在屏幕上可视部分,也就是说contentSize的宽要大于UIScrollView.frame.size.width才能实现滑动浏览的功能。

另外,图片浏览,为了避免一开始就load所有的UIImageView,可以选择仅仅load当前浏览页面及前后三个UIImageView。而这之外的page上的子视图我们都设置为[NSNull null]。我们在检测到滑动后,再lazy load 所需的UIImageView。

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView *scrollView;

@property (nonatomic, strong) UIPageControl *pageControl;

@property (nonatomic, strong) NSArray *pageImages;

@property (nonatomic, strong) NSMutableArray *pageViews;

- (void)loadVisiblePages;

- (void)loadPage:(NSInteger)page;

- (void)purgePage:(NSInteger)page;

@end

@implementation ViewController

@synthesize scrollView;

@synthesize pageControl;

@synthesize pageImages;

@synthesize pageViews;

- (void)viewDidLoad {

[super viewDidLoad];

// 1

pageImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"2.jpg"],

[UIImage imageNamed:@"5.jpg"],[UIImage imageNamed:@"2.jpg"], [UIImage imageNamed:@"5.jpg"],nil];

NSInteger pageCount = pageImages.count;

pageViews = [[NSMutableArray alloc]init];

for (NSInteger i=0; i<pageCount; i++) {

[self.pageViews addObject:[NSNull null]];

}

// 2

self.scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];

[self.view addSubview:scrollView];

scrollView.delegate = self;

self.pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 400, 320, 20)];

self.pageControl.currentPage = 0;

[self.pageControl setNumberOfPages:pageCount];

[pageControl setBackgroundColor:[UIColor grayColor]];

[self.view addSubview:pageControl];

}

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

CGSize pagesScrollViewSize = self.scrollView.frame.size;

self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * self.pageImages.count, pagesScrollViewSize.height);

[self loadVisiblePages];

}

- (void)loadVisiblePages {

CGFloat pageWidth = scrollView.frame.size.width;

NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x*2.0f+pageWidth)/(pageWidth*2.0f));

pageControl.currentPage = page;

NSInteger firstPage = page - 1;

NSInteger lastPage = page + 1;

// Pure anything before the first page

for (NSInteger i = 0; i< firstPage; i++) {

[self purgePage:i];

}

// Load pages in our range

for (NSInteger i = firstPage; i<=lastPage; i++) {

[self loadPage:i];

}

// Purge anything after last page

for (NSInteger i = lastPage+1; i<self.pageImages.count; i++) {

[self purgePage:i];

}

}

- (void)loadPage:(NSInteger)page {

if (page<0 ||  page>=self.pageImages.count) {

return;

}

UIView *pageView = [self.pageViews objectAtIndex:page];

if ((NSNull *)pageView == [NSNull null]) {

CGRect frame = self.scrollView.bounds;

frame.origin.x = frame.size.width * page;

frame.origin.y = 0.0f;

UIImageView *imageView = [[UIImageView alloc]initWithImage:[self.pageImages objectAtIndex:page]];

imageView.contentMode = UIViewContentModeScaleAspectFit;

imageView.frame = frame;

[self.scrollView addSubview:imageView];

[self.pageViews replaceObjectAtIndex:page withObject:imageView];

}

}

- (void)purgePage:(NSInteger)page {

if (page < 0 || page >= self.pageImages.count) {

// If it‘s outside the range of what you have to display, then do nothing

return;

}

// Remove a page from the scroll view and reset the container array

UIView *pageView = [self.pageViews objectAtIndex:page];

if ((NSNull*)pageView != [NSNull null]) {

[pageView removeFromSuperview];

[self.pageViews replaceObjectAtIndex:page withObject:[NSNull null]];

}

}

#pragma mark - Scroll View delegate

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

[self loadVisiblePages];

}

 

几个注解:

-判断当前页面是第几个页面时,我们通过UIScrollView.contentOffset.x和pageWidth来判断,这里有一点数学上的运算。

-为了监测scrollView滑动的变化,设置scrollView的delegate,并且实现delegate中scrollViewDidScroll:方法。

时间: 2025-01-22 04:43:42

UIScrollView和UIPageControl结合实现图片浏览的相关文章

UI基础--使用UIScrollView、UIPageControl、NSTimer实现图片循环播放

实现思路: 1.创建一个UIScrollView,这里设置为宽度300,高度130,通过storyboard创建: 2.使用代码在UIScrollView中添加ImageView,横向放入多张ImageView: 3.设置UIScrollView的contentSize为所有图片的宽度总和: 4.要保证UIScrollView的宽度等于一张ImageView的宽度,才能正确分页: 5.添加UIPageControl控件,设置当前页数和总页数: 6.添加NSTimer实现自动循环: UIPageC

使用UIScrollView和UIPageControl做一个可以用手势来切换图片的效果

利用UIScrollView的滚动效果来实现,先上图: 实现过程是:在viewController里先加入UIScrollView和UIPageControl: -(void) loadView { [super loadView]; UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320,480)]; UIPageControl* pageControl = [[UIPageCont

使用UIScrollView和UIPageControl做一个能够用手势来切换图片的效果

利用UIScrollView的滚动效果来实现,先上图: 实现过程是:在viewController里先增加UIScrollView和UIPageControl: -(void) loadView { [super loadView]; UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320,480)]; UIPageControl* pageControl = [[UIPageCont

UIScrollView 和UIPageControl 实现app启动滑动图

一.使用NSUserDefaults 判断滑动图有没有出现过,加载滑动图 NSUserDefaults 简介: NSUserDefaults可以将数据永久的保存在手机中,他是一个单例,用起来很方便,所以很适合用于保存简单的数据和为数据做标记 你可以选择在AppDelegate.m中的didFinishLaunchingWithOptions 方法或者"初始界面"(加载的第一个viewController)的 viewDidLoad 方法中进行判断滑动图是否出现过,写上代码: NSUse

iOS— UIScrollView和 UIPageControl之间的那些事

本代码主要实现在固定的位置滑动图片可以切换. 目录图如下: ViewController.h #import <UIKit/UIKit.h> // 通过宏定义定义宽和高 #define WIDTH self.view.frame.size.width #define HEIGHT self.view.frame.size.height @interface ViewController : UIViewController<UIScrollViewDelegate> @proper

iOS基础——通过案例学知识之LaunchScreen、APPIcon、StatusBar、UIScrollView、UIPageControl

iOS基础--通过案例学知识之LaunchScreen.APPIcon.StatusBar.UIScrollView.UIPageControl 今天要实现的案例效果图 一.LaunchScreen 1.设置程序的LaunchScreen 在项目配置文件中配置启动页,并且在LaunchScreen.storyboard中进行布局 2.设置LaunchScreen时间 //单位:秒 [NSThread sleepForTimeInterval:1.5f]; 二.APPIcon 1.命名规则:iOS

UIscrollView和UIPageControl的循环滚动

因为昨天在网上找了很久,很多只能实现向右滚动,而且一张图一个imageview ,感觉工作量很可怕啊 ,  下面的例子就是不论你多少图 , 只和我代码里面的几个数值有关,  只需要修改分页和循环i的最大值,当然为了方便 , 您最好把图片的名字改成有序的 . 方便您添加到可变集合中. 如果这样的页面你有五页 或则更多都可以实现好像从最后一张图跳到第一张图. 这个其实总共只有3个image,图都是用循环加进去的 . 上代码 #import <UIKit/UIKit.h> #define WIDTH

IOS scrollView 图片浏览

// // ViewController.m // 0426 // // Created by apple on 15/4/26. // Copyright (c) 2015年 gense. All rights reserved. // #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> { UIPageControl * pageControl; //定义图片名称集合

IOS 之 UIScrollView,UIPageControl

UIScrollView 可以用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,UIPageControl 类提供一行点来指示当前显示的是多页面视图的哪一页. 下面实现一个简单的图片自动播放器为例说说 UIScrollView 与 UIPageControl类中的一些方法. 注意:下述代码中的 scrollY,kScreenWidth,kScreenHeight,kImgCount 等都是定义好的常量 #define kScreenHeight [UIScreen mainSc