iOS学习笔记——第六天
iOS学习笔记——第六天
今日学习概述
今天主要进行iOS开发中经常被用到的UIScrollView控件的学习,包括其基本使用、常见属性、代理的注意点等。
什么是UIScrollView
- 移动设备的屏幕大小是及其有限的,因此直接展示在用户眼前的内容也相当有限。
- 当展示的内容较多,超出一个屏幕时,用户可以通过滚动手势来查看屏幕以外的内容。
- 普通的UIView不具备滚动功能,不适合显示过多内容。
- UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容。
利用UIScrollView显示一张大图片
//1.创建一个UIScrollView
UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.frame = CGRectMake(100, 100, 200, 200);
scrollView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:scrollView];
//2.创建一个UIImageView
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IMG_0420"]];
//3.加入到scrollView中
[scrollView addSubview:imageView];
//4.设置scrollView的contentSize
scrollView.contentSize = imageView.frame.size;
效果图为
UIScrollView无法滚动的原因
- 没有设置contentSize
- scrollEnabled = NO
- userInteractionEnabled = NO
UIScrollView的重要属性
-
contentOffset(内容的偏移量)
作用:控制内容滚动的位置;得知内容滚动的位置。
注:偏移量是scrollview的x(y)值减去contentsize的x(y)值。偏移量越大,越往左上角靠。 -
contentInset (内边距)
代理
- 任何OC对象都可以作为scrollView的代理。
- 苹果设计的代理属性为什么是weak——防止循环引用,内存泄漏。
- 代理是用来监听控件的某些行为。
利用UIScrollView实现内容缩放
#import "ViewController.h"
@interface ViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建UIImageView
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IMG_0420"]];
[self.scrollView addSubview:imageView];
//2.设置contentsize
self.scrollView.contentSize = imageView.frame.size;
//3.设置最小,最大缩放量
self.scrollView.minimumZoomScale = 0.5;
self.scrollView.maximumZoomScale = 3.0;
self.scrollView.delegate = self;
self.imageView = imageView;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageView;
}
@end
效果图为
UIScrollView分页功能
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView.delegate = self;
CGFloat scrollViewW = self.scrollView.frame.size.width;
CGFloat scrollViewH = self.scrollView.frame.size.height;
//1.添加图片
int count = 5;
for (int i = 0; i<count; i++) {
UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(i * scrollViewW, 0, scrollViewW, scrollViewH);
NSString *name = [NSString stringWithFormat:@"img_%d",i];
imageView.image = [UIImage imageNamed:name];
[self.scrollView addSubview:imageView];
}
//2.设置contentsize
self.scrollView.contentSize = CGSizeMake(5 * scrollViewW, scrollViewH);
//3.设置滚动条为不可见
self.scrollView.showsVerticalScrollIndicator = NO;
self.scrollView.showsHorizontalScrollIndicator = NO;
//4.开启分页功能
self.scrollView.pagingEnabled = YES;
//5.设置总页数
self.pageControl.numberOfPages = count;
//6.单页时隐藏pageContrl
self.pageControl.hidesForSinglePage = YES;
}
#pragma mark - UIScrollViewDelegate
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
//1.计算页码
int page = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
//2.设置页码
self.pageControl.currentPage = page;
}
@end
效果图为
NSTimer定时器
一般来说会有这样的需求:要求图片自动播放,这时候就需要用到NSTimer。
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView.delegate = self;
CGFloat scrollViewW = self.scrollView.frame.size.width;
CGFloat scrollViewH = self.scrollView.frame.size.height;
//1.添加图片
int count = 5;
for (int i = 0; i<count; i++) {
UIImageView *imageView = [[UIImageView alloc] init];
imageView.frame = CGRectMake(i * scrollViewW, 0, scrollViewW, scrollViewH);
NSString *name = [NSString stringWithFormat:@"img_%d",i];
imageView.image = [UIImage imageNamed:name];
[self.scrollView addSubview:imageView];
}
//2.设置contentsize
self.scrollView.contentSize = CGSizeMake(5 * scrollViewW, scrollViewH);
//3.设置滚动条为不可见
self.scrollView.showsVerticalScrollIndicator = NO;
self.scrollView.showsHorizontalScrollIndicator = NO;
//4.开启分页功能
self.scrollView.pagingEnabled = YES;
//5.设置总页数
self.pageControl.numberOfPages = count;
//6.单页时隐藏pageContrl
self.pageControl.hidesForSinglePage = YES;
//7.开启定时器
[self startTimer];
}
- (void)nextPage{
//1.计算下一页的页码
NSInteger page = self.pageControl.currentPage + 1;
//2.假如超过最后一页
if (page == 5){
page = 0;
}
//3.滚动到下一页
[self.scrollView setContentOffset:CGPointMake(page * self.scrollView.frame.size.width, 0) animated:YES];
}
#pragma mark - UIScrollViewDelegate
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
//1.计算页码
int page = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
//2.设置页码
self.pageControl.currentPage = page;
}
#pragma mark - 定时器相关代码
-(void)startTimer
{
//返回一个自动执行的定时器对象
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage) userInfo:@"123" repeats:YES];
//NSDefaultRunLoopMode(默认):同一时间只能执行一个任务
//NSRunLoopCommonModes(公用):可以分配一定的时间执行其他任务
//作用:修改timer在runLoop中的模式为NSRunLoopCommonModes
//目的:不管主线程在做什么操作,都会分配一定的时间处理定时器
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)stopTimer
{
[self.timer invalidate];
}
//用户即将开始拖拽scrollView时,停止定时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self stopTimer];
}
//用户停止拖拽scrollView时,开始定时器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self startTimer];
}
@end