[How to] UIScrollView的使用方法
1.简介
延续前一个博客使用Xib来创建view,本文我们创建一个带有PageControlView的ScrollView的table的headView,如下图:
具有自动滚动:

具有拖拽完毕后,自动滚动继续效果:

2.实现
本文中将在TableView的headView中增减一个scrollView和PageControl两个控件来展示你的热点商品信息。
同样的我们还是使用xib来包装这个局部。
1.按照如下新建xib文件,并设置Custom Class 为之后创建的自定义View类。

在这个xib设计中,两个View设定高度为1,作为两条分隔横线来使用。
需要特别注意的是:ScrollerView与PageControl一定要有一定要按照如图所示先定义ScrollView然后在定义PageControlView这样在实际云顶的时候ScrollView才不会覆盖掉PageControlView。在使用代码创建的时候也应该这种顺序进行addsubview操作。
2.定义完后需要定义xib对应的View class文件:
XFHeadView.h
#import <UIKit/UIKit.h> @interface XFHeadView : UIView // 需要显示的所有图片信息 @property (nonatomic, strong) NSArray *pictsList; // 类创建方法 +(instancetype) headViewInit; @end
XFHeadView.m
//
// XFHeadView.m
// How to create groupBuy page
//
// Created by apple on 15/12/17.
// Copyright © 2015年 apple. All rights reserved.
//
#import "XFHeadView.h"
@interface XFHeadView()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollerView;
@property (weak, nonatomic) IBOutlet UIPageControl *indexView;
// 计算使用变量
@property(nonatomic,assign) CGSize scrollViewSize;
// 自动滚动timer
@property(nonatomic, strong) NSTimer *timer;
@end
@implementation XFHeadView
+(instancetype) headViewInit;
{
// 从xib文件中加载 view
XFHeadView * headView = [[[NSBundle mainBundle] loadNibNamed:@"XFHeadView" owner:nil options:nil]lastObject];
// 设定尺寸的计算变量
headView.scrollViewSize = headView.scrollerView.bounds.size;
// 设定scrollerView的代理为当前view对象
headView.scrollerView.delegate = headView;
// 设定一些固定的控件配置
// 禁止纵向滚动
headView.scrollerView.showsHorizontalScrollIndicator = NO;
// 分页显示
headView.scrollerView.pagingEnabled = YES;
// 返回
return headView;
}
-(void)addAutoNextPageTimer
{
// 如果已有timer在运行则将其停止销毁
if (self.timer != nil && self.timer.isValid)
{
[self.timer invalidate];
self.timer = nil;
}
// 新建timer
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
self.timer = timer;
// 将此timer加入到主loop中去,并设定NSRunLoopCommonModes,防止在主loop中阻塞
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode: NSRunLoopCommonModes];
}
/**
* 滚动到下一页
*/
-(void)nextPage
{
// 设定pageControl,在这里不这是pageControl变量的值,这个值到代理方法中计算
NSInteger page = self.indexView.currentPage;
) {
page = ;
}
else{
page++;
}
/**
* 根据当前页码来控制scroll的off位置,去显示正确的图片
*/
CGFloat offsetX = page * self.scrollerView.frame.size.width;
[UIView animateWithDuration:1.0 animations:^{
self.scrollerView.contentOffset = CGPointMake(offsetX, );
}];
}
/**
* 设定图片信息
*
* @param pictsList pictsList description
*/
-(void) setPictsList:(NSArray *)pictsList
{
_pictsList = pictsList;
// 设定UIPageControl
self.indexView.numberOfPages = pictsList.count;
self.indexView.currentPage = ;
// 首先需要将将scrollView上所有字view,也就是全部图片清除
[self.scrollerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
// 设定需要加载的图片
; i < pictsList.count; i++)
{
// 创建图片空间
UIImageView *imageView = [[UIImageView alloc] init];
[self.scrollerView addSubview:imageView];
// 设定图片
NSString *imageName = pictsList[i];
imageView.image = [UIImage imageNamed:imageName];
// 设定在scrollView中每一张图的排版
CGFloat x = i * self.scrollViewSize.width;
imageView.frame = CGRectMake(x, , self.scrollViewSize.width, self.scrollViewSize.height);
}
// 设置滚动空间的滚动范围,只有横向滚动,无纵向滚动
self.scrollerView.contentSize = CGSizeMake(pictsList.count * self.scrollViewSize.width, );
// 开始自动滚动
[self addAutoNextPageTimer];
}
#pragma mark --scrollView的代理方法
// 正在滚动
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
// 计算pageControl的值
) / self.scrollerView.frame.size.width;
self.indexView.currentPage = page;
}
// 当点住scrollView不让图片自动滚动的时候停止自动化timer
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.timer invalidate];
self.timer = nil;
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self addAutoNextPageTimer];
}
@end
3.代码说明:
ScrollView拥有代理属性,将代理设置为本类:
// 设定scrollerView的代理为当前view对象
headView.scrollerView.delegate = headView;
4.使用自定义View
在controller中只要简单的将此View创建并赋值给headView属性即可:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
XFHeadView *headView = [XFHeadView headViewInit];
headView.pictsList = @[@"headimage_01", @"headimage_02", @"headimage_03", @"headimage_04"];
self.goodsTableView.tableHeaderView = headView;
。。。。
。。。。
}
3.总结
ScrollView空间关键点在于设置内部图片的位置,你可以将ScrollView想象成一个潜水镜,在发生scrol的时候其实是scrollView这个潜水镜在移动,而内部内容并没有移动。
[How to] UIScrollView的使用方法的更多相关文章
- UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置
一个UICollectionView有好多个cell,滑动一下,谁也不知道会停留在哪个cell,滑的快一点,就会多滑一段距离,反之则会滑的比较近,这正是UIScrollview用户体验好的地方. 如果 ...
- 【UIScrollView】基本方法+基本描述
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )]; scrollView.backgroundColor = [ ...
- 关于UIScrollView属性和方法的总结
iOS中UIScollView的总结 在iOS开发中可以说UIScollView是所有滑动类视图的基础,包括UITableView,UIWebView,UICollectionView等等,UIScr ...
- 关于UIScrollView属性跟方法的总结
iOS中UIScollView的总结 在iOS开发中可以说UIScollView是所有滑动类视图的基础,包括UITableView,UIWebView,UICollectionView等等,UIScr ...
- [转]IOS 学习笔记(8) 滚动视图(UIScrollView)的使用方法
下面介绍pageControl结合ScrollView实现连续滑动翻页的效果,ScrollView我们在应用开发中经常用到,以g这种翻页效果还是很好看的,如下图所示: 通过这个例子,我们重点学习UIS ...
- IOS UIScrollView常用代理方法
iOS UIScrollView代理方法有很多,从头文件中找出来学习一下 //只要滚动了就会触发 - (void)scrollViewDidScroll:(UIScrollView *)scrollV ...
- UIScrollView 的代理方法简单注解
//减速停止了时执行,手触摸时执行执行 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; //只要滚动了就会触发 ...
- ios滚动UIScrollView的setContentOffset方法
在UIScrollView,setContentOffset方法的功能是跳转到你指定内容的坐标,[self.scroview setContentOffset:CGPointMake(0, 50) a ...
- UIScrollView的代理方法(delegate)
// ViewController.m // 05-UIScrollView的代理(delegate) #import "ViewController.h" @interface ...
随机推荐
- (一)Redis简介及安装
Redis简介 Redis 是一个开源(BSD许可)的,内存中的key-value数据结构存储系统,它可以用作数据库.缓存和消息中间件. Redis具有丰富的数据结构类型.包括字符串(string), ...
- html的body内标签之input系列1
1. Form的作用:提交当前的表单. 类似于去了银行提交的纸质单子,递到后台去办理相关业务. text,password只有输入的功能:button,submit只有点击的功能.想要把这些信息提交, ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...
- BZOJ3172:[TJOI2013]单词——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单 ...
- [usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp
原网站大概已经上不了了-- 题目大意: 求出平面上n个点组成的一个包含顶点数最多的凸多边形.n<=250. 考虑我们每次枚举凸包的左下角为谁(参考Graham求凸包时的左下角),然后像Graha ...
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 3366 Solved: 1355 [Submit][St ...
- 【树形DP】【P1364】医院放置
传送门 Description 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接 ...
- C语言超大数据相加计算整理
在做ACM 1002题时,整理得到. #include<stdio.h>#include<string.h>#define MAX 1000void zero(char *s, ...
- HDU1540 区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- c# 定时执行任务
在Global.asax文件中加上 void Application_Start(object sender, EventArgs e) { // Code that runs on applicat ...