第二十篇:滚动视图UIScrollView ,分页控制器UIPageControl 定时器 NSTimer

1.什么是UIScrollView:

•移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限
•当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容
•普通的UIView不具备滚动功能,不能显示过多的内容
•UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容

2.UIScrollView基本使用:
》将需要展示的内容添加到UIScrollView中
》设置UIScrollView的contentSize属性,告诉UIScrollView所有内容的尺寸,也就是告诉它滚动的范围(能滚多远,滚到哪里是尽头)

3.UIScrollView常用属性:
// scrollView对象当前滚动到contentOffset 位置
@property(nonatomic)         CGPoint                      contentOffset;                  // default CGPointZero 

// scrollView对象可以滚动的范围大小
@property(nonatomic)         CGSize                       contentSize;                    // default CGSizeZero

//  scrollView对象在top,left,bottom,right四个边上额外增加的滚动区域
@property(nonatomic)         UIEdgeInsets                 contentInset;                   // default UIEdgeInsetsZero. add additional scroll area around content

// scrollView对象的代理,用动兼听该scrollView对象
@property(nullable,nonatomic,weak) id<UIScrollViewDelegate>        delegate;                       // default nil. weak reference

// 设置UIScrollView是否需要弹簧效果
@property(nonatomic) BOOLbounces;

// 设置UIScrollView是否能滚动
@property(nonatomic,getter=isScrollEnabled)BOOL scrollEnabled;

// 是否显示水平滚动条
@property(nonatomic) BOOL showsHorizontalScrollIndicator;

// 是否显示垂直滚动条
@property(nonatomic) BOOL showsVerticalScrollIndicator;

// 视图最小缩放比例
@property(nonatomic) CGFloat minimumZoomScale;     // default is 1.0

// 视图最大缩放比例
@property(nonatomic) CGFloat maximumZoomScale;     // default is 1.0. must be > minimum zoom scale to enable zooming


4.scrollView对象代理delegate:

》要成为delegate,那么就得遵守UIScrollViewDelegate协议,然后实现协议中相应的方法和指定一个代理对象,就可以监听UIScrollView的滚动过程了。

》监听过程:当UIScrollView对象被滚动时,就会自动调用代理delegate对象己实现的确定方法。

》代理常用方法:

//scrollView对象正在滚动时调用该方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;   

// scrollView对象在被拖动前一刻调用该方法
// 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. decelerate is true if it will continue moving afterwards
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

//当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的viewForZoomingInScrollView:方法,这个方法返回的控件就是需要进行缩放的控件
- (nullableUIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;    // return a view that will be scaled. if delegate returns nil, nothing happens

5.如果UIScrollView无法滚动,可能是以下原因:

>没有设置contentSize
>scrollEnabled = NO
>没有接收到触摸事件:userInteractionEnabled = NO
>没有取消autolayout功能(要想scrollView滚动,必须取消autolayout)

6.缩放实现步骤:
(1)
》1.设置UIScrollView的id<UISCrollViewDelegate>delegate代理对象
》2.设置minimumZoomScale:缩小的最小比例
》3.设置maximumZoomScale:放大的最大比例
》4.让代理对象实现下面的方法,返回需要缩放的视图控件

- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView;

(2)•跟缩放相关的其他代理方法
》缩放完毕的时候调用

-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view

》正在缩放的时候调用

-(void)scrollViewDidZoom:(UIScrollView *)scrollView


7.分页,及UIPageControl使用:
•只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示
•一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下
//一共有多少页
@property(nonatomic)NSInteger numberOfPages;

//当前显示的页码
@property(nonatomic)NSInteger currentPage;

//只有一页时,是否需要隐藏页码指示器
@property(nonatomic)BOOL hidesForSinglePage;

//其他页码指示器的颜色
@property(nonatomic,retain)UIColor *pageIndicatorTintColor;

//当前页码指示器的颜色
@property(nonatomic,retain)UIColor *currentPageIndicatorTintColor;


8.NSTimer使用:
NSTimer叫做“定时器”,它的作用如下
》在指定的时间执行指定的任务
》每隔一段时间执行指定的任务
》调用下面的方法就会开启一个定时任务

+ (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti   target:(id)aTarget    selector:(SEL)aSelector     userInfo:(id)userInfo     repeats:(BOOL)yesOrNo;

每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务

•通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

- (void)invalidate;

// 1.开起定时器
 [self.timer  setFireDate:[NSDate distantPast]];
// 关闭定时器
 [self.timer setFireDate:[NSDate distantFuture]];
//修改 NSTimer对象 的 run loop , 解决 “拖动时” 定时器 不会自动停止
 [[NSRunLoop currentRunLoop] addTimer:_timer forMode:UITrackingRunLoopMode];


9.实例:

//
//  ViewController.m
//  05-西马拉牙
//
//  Created by 瞿杰 on 15/9/25.
//

#import "ViewController.h"

#define AD_BAR_IMG_NUMBER 5

@interface ViewController ()<UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIScrollView *adBarScrollView;
@property (weak, nonatomic)  UIPageControl * pageControl;

- (void)addAdBarImgView;
- (void)addPageControl;
- (void)nextImgView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置缩放
    self.scrollView.delegate = self;
    self.scrollView.minimumZoomScale = 0.5;
    self.scrollView.maximumZoomScale = 2.0;
//    self.scrollView.bouncesZoom = YES ;
    CGSize size = self.view.frame.size;
    self.scrollView.contentSize = CGSizeMake(size.width, size.height + 50);
    self.scrollView.contentOffset = CGPointMake(0, -100);
//    self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 30, 40);
    
    [self addAdBarImgView];
    [self addPageControl];
    // 定时器
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(nextImgView) userInfo:nil repeats:YES];
    
}

/** scrollView代理对象方法,用于反回一个需要缩放的视图控件*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return [[scrollView subviews] objectAtIndex:0] ;
}

/** 添加广告栏图片 */
- (void)addAdBarImgView{
    
    int numberBar = AD_BAR_IMG_NUMBER;
    CGFloat adBarImgW = self.adBarScrollView.frame.size.width ;
    CGFloat adBarImgH = self.adBarScrollView.frame.size.height ;
    CGFloat adBarImgY = 0 ;
    
    for (int i = 0; i < numberBar; i++) {
        UIImageView * adBarImg = [[UIImageView alloc]init];
        CGFloat adBarImgX = i * adBarImgW ;
        adBarImg.frame = CGRectMake(adBarImgX, adBarImgY, adBarImgW, adBarImgH);
        [adBarImg setImage:[UIImage imageNamed:[NSString stringWithFormat:@"img_%02d",i+1]]];
        [self.adBarScrollView addSubview:adBarImg];
    }
    self.adBarScrollView.contentSize = CGSizeMake(numberBar * adBarImgW, adBarImgH);
    self.adBarScrollView.showsHorizontalScrollIndicator = NO;
//    self.adBarScrollView.pagingEnabled = YES ;
    
    
}

- (void)addPageControl{
    
    UIPageControl * pageControl = [[UIPageControl alloc]init];
    CGFloat pageW = 100 ;
    CGFloat pageH = 20 ;
    CGFloat pageX = (self.adBarScrollView.frame.size.width - pageW )/2;
    CGFloat pageY = self.adBarScrollView.frame.size.height - pageH ;
    pageControl.frame = CGRectMake( pageX, pageY, pageW, pageH);
    pageControl.numberOfPages = AD_BAR_IMG_NUMBER ;
    pageControl.currentPageIndicatorTintColor = [UIColor redColor];
    pageControl.pageIndicatorTintColor = [UIColor blueColor];
    self.pageControl = pageControl ;
    [self.view addSubview:pageControl];
}

//定时器每隔 1 秒调用方法一次,使得图片被循环显示
- (void)nextImgView{
//    NSLog(@"-------%ld",self.pageControl.currentPage);
    if(self.pageControl.currentPage == AD_BAR_IMG_NUMBER -1)
        self.pageControl.currentPage = 0 ;
    else
        self.pageControl.currentPage++;
    
    self.adBarScrollView.contentOffset = CGPointMake(self.pageControl.currentPage * self.adBarScrollView.frame.size.width, 0);
}
@end


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值