上篇有讲解简单的基础视图使用,同时也有关于UIKit学习的基础框架,那本篇就来认识一些高级视图也是在ios开发种比较常用的一些视图。
UIScrollView实现滚动和缩放的ui控件。
滚动和缩放的时候是UIScrollView中的内容进行滚动和缩放,UIScrollView自身是不动的;
1.属性:
contensize:可以滚动的范围 设置内容实际大小;contentoffset:设置内容的偏移量 contentlnset:设置滚动区域四周的滚动范围,内容的内边距
2.实现滚动,缩放
3.常用代理方法:
UIScrollview和他的代理对象是通过delegate属性关联起来的,通过指定的uiscrollview的delegate属性,告诉uiscrollview哪个对象要成为uiscrollerview的代理对象;
监听UIScrollView的滚动事件,需要代理来进行实现,无法通过addTarget方法来监听:
- 为UIScrollview找一个代理对象,也就是设置UIScrollView属性;
self.scrollview.delegate = self;///不需要单独创建新的代理对象,直接将控制器作为代理对象
- 为了保证代理对象拥有代理方法,必须要让代理对象拥有这些方法,那么该控制器就要遵守该控件的代理协议
- 实现对应所需要的方法
4.和UIPageControl实现分页
UIPageControl:通过pagecontrol来设置总共页数,当前显示的页数 ,指示器的颜色等等;
5.NSTimer的使用,计时器控件。
在指定的时间执行指定的任务/每隔一段时间执行指定的任务;
创建NSTimer:NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(respondDoFun) userInfo:nil repeats:YES];
respondDoFun是响应计时器的方法;
///停止计时器,但不可重用,下次开启时必须创建新的计时器
[self.timer invalidate]; self.timer = nil;
UIScrollview的代理方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView; // 当UIScrollview滚动时就会调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView API_AVAILABLE(ios(3.2));
// called on start of dragging (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset API_AVAILABLE(ios(5.0));
// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; // called on finger up as we are moving
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; // called when setContentOffset/scrollRectVisible:animated: finishes. not called if not animating
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; // return a view that will be scaled. if delegate returns nil, nothing happens
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view API_AVAILABLE(ios(3.2)); // called before the scroll view begins zooming its content
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale; // scale between minimum and maximum. called after any 'bounce' animations
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView; // return a yes if you want to scroll to the top. if not defined, assumes YES
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;
- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;
附加:
- UITableView继承于UIScrolView
- 控件的优先级高于网络和计时器;要想在控制器中同时进行,要设置网络和计时器的优先级;
例如:
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addTimer:self.timer forMode:NSRunLoopCommonModes];
利用UIScorllview实现图片轮播,代码如下:
#import "RoateImageViewController.h"
@interface RoateImageViewController ()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView *scrollview;
@property(nonatomic,strong)UIImageView *imageview;
@property(nonatomic,strong)UIPageControl *pagecontrol;
@property(nonatomic,strong)NSTimer *timer;
@end
@implementation RoateImageViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUI];
self.scrollview.delegate = self;
}
-(void)setUI{
self.view.backgroundColor = [UIColor whiteColor];
UIScrollView *scoview = [[UIScrollView alloc]initWithFrame:CGRectMake(10, 100, 400, 300)];
scoview.backgroundColor = [UIColor blackColor];
self.scrollview = scoview;
[self.view addSubview:self.scrollview];
///动态添加内容scrollview
CGFloat imgw = 400;///宽
CGFloat imgh = 300;///高
CGFloat imgy = 0;
for (int i = 0; i < 5; ++i) {
UIImageView *imview = [[UIImageView alloc]init];
NSString *imagename = [NSString stringWithFormat:@"%d",i];
imview.image = [UIImage imageNamed:imagename];
CGFloat x = i * imgw;
imview.frame = CGRectMake(x, imgy, imgw, imgh);
self.imageview = imview;
[self.scrollview addSubview:self.imageview];
}
CGFloat maxw = self.scrollview.frame.size.width * 5;
self.scrollview.contentSize = CGSizeMake(maxw, 0);
///实现uiscrollview的分页效果 按照当前uiscrollview的宽度来进行的分页操作 当前宽度作为一页来进行
self.scrollview.pagingEnabled = YES;
///隐藏滚动指示器
self.scrollview.showsHorizontalScrollIndicator = NO;
///UIPageControll默认情况下于UIScorllview没有关系,必须通过关联
///创建分页显示条
UIPageControl *pagecon = [[UIPageControl alloc]init];
pagecon.numberOfPages = 5;///设置总页数
pagecon.currentPage = 0;///指定默认页为第0页
pagecon.frame = CGRectMake(150, 300, 150, 150);
pagecon.pageIndicatorTintColor = [UIColor blackColor];
pagecon.currentPageIndicatorTintColor = [UIColor redColor];
self.pagecontrol = pagecon;
[self.view addSubview:self.pagecontrol];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollimage) userInfo:nil repeats:YES];
///修改优先级
///创建一个消息循环对象
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addTimer:self.timer forMode:NSRunLoopCommonModes];
}
///滚动图片
-(void)scrollimage{
///每次执行该方法时,都要滚动到下一页
NSInteger page = self.pagecontrol.currentPage;///获取当前uipagecontrol的页码
if(page == self.pagecontrol.numberOfPages-1){
page = 0;
}else{
page++;
}
CGFloat offsetx = page*self.scrollview.frame.size.width;
[self.scrollview setContentOffset:CGPointMake(offsetx, 0) animated:YES];
///如果已经滚动到最后一页,就滚动显示第一页
}
///开始拖拽时,停止计时器
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
///停止计时器,但不可重用,下次开启时必须创建新的计时器
[self.timer invalidate];
self.timer = nil;
}
///停止拖拽时,开启计时器
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollimage) userInfo:nil repeats:YES];
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addTimer:self.timer forMode:NSRunLoopCommonModes];
}
///滚动事件 计算当前是第几页
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
///如何计算当前是第几页
///获取当前的滚动偏移量
CGFloat offsetx = self.scrollview.contentOffset.x;
///用已经偏移的值加上半页的宽度
offsetx = offsetx + (self.scrollview.frame.size.width * 0.5);
///用x方向的偏移除以一张图片的宽度,取商就是滚动到了当前第几页
int page = offsetx / self.scrollview.frame.size.width;
///将页码设置给uipagecontrol
self.pagecontrol.currentPage = page;
}