iOS开发之UIKit学习(二)—— UIScrollView

1,478 阅读4分钟

上篇有讲解简单的基础视图使用,同时也有关于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;

附加:

  1. UITableView继承于UIScrolView
  2. 控件的优先级高于网络和计时器;要想在控制器中同时进行,要设置网络和计时器的优先级;

例如:

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;

}