UIScrollView与NSTimer计时器、分页指示器控件的使用

UIScrollView是什么?

——UIScrollView也是一种控件

——用来实现“滚动”和“缩放”的控件 


为什么要“滚动”或“缩放”?

- 移动设备屏幕大小有限,当要显示的内容太大时,为了能更方便的查看内容所以需要“滚动”和“缩放”(“滚动”和“缩放”指的是放到UIScrollView控件里面的内容


UIScrollView实现滚动(分三步):  

》1.拖一个UIScrollView到界面上,并设置大小


》2.将需要展示的内容添加到UIScrollView中


》3.设置UIScrollView的contentSize属性

——contentSize属性的含义是:告诉UIScrollView要展示的内容实际有多大(尺寸),也就是告诉UIScrollView滚动的范围(要展示的内容超出可视范围UIScroll的范围才会滚动

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

UIScrollView实现缩放(六步):
•1.添加UIScrollView, 设置UIScrollView的宽和高与控制器大小一致

•2. 向UIScrollView中添加子控件UIImageView, 设置图片, 设置UIImageView 的大小与图片的实际大小一致。

•3.设置UIScrollView的代理为当前控制器

•4. 设置当前控制器遵守UIScrollViewDelegate代理协议

•5. 在控制器中实现代理方法
–- (UIView *)viewForZoomingInScrollView:方法返回要缩放的子控件(该方法返回的控件就是scrollView要缩放的控件,并且一次只能缩放一个控件

•6. 在viewDidLoad中设置缩放比例
–self.scrollView.maximumZoomScale = 2.0; // 最大放大到2倍
–self.scrollView.minimumZoomScale = 0.4; // 最小缩小到0.4倍

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


UIScrollView的常见属性:

@property (nonatomic)CGPoint    contentOffset;

   当UIScrollView内部滚动时,内容相当于UIScrollView左上角的偏移

示例:

直接使用动画的方式来设置contentOffset属性的值

[self.scrollView setContentOffset:point animated:YES];

——————————————————————————————————————————————
@property (nonatomic) CGSize     contentSize;
  UIScrollView里面内容的大小

——————————————————————————————————————————————

@property (nonatomic) UIEdgeInsets contentInset;

  内容的内边距

  设置UIScrollView的内容在拖动以后,内容距离UIScrollView的内边距。(联想按钮的内边距属性:Inset)

tpyedef struct UIEdgeInsets{

    CGFloat top, left, bottom, right;

} UIEdgeInsets;


设置UIScrollView的内容的内边距

self.scrollview.contentInset = UIEdgeInsetsMake(100, 50, 30, 5);

——————————————————————————————————————————————

以上三种属性图解:

——————————————————————————————————————————————

其他属性:

@property(nonatomic,getter=isPagingEnabled) BOOL  pagingEnabled;

是否分页

示例:

// 实现自动分页

self.scrollView.pagingEnabled = YES; // scrollView是根据自身的宽度来实现分页的

————————————————————————————————————————————————————————————————————————————

@property (nonatomic)BOOL bounces;

设置UIScrollView是否需要弹簧效果

——————————————————————————————————————————————

@property (nonatomic,getter=isScrollEnable)BOOL scrollEnabled;

设置UIScrollView是否能滚动

——————————————————————————————————————————————

@property (nonatomic)BOOL showHorizontalScrollIndicator;

是否显示水平滚动条

示例:

不显示水平滚动指示器

self.scrollView.showsHorizontalScrollIndicator = NO;

——————————————————————————————————————————————

@property (nonatomic)BOOL showsVerticalScrollIndicator;

是否显示垂直滚动条

示例:

不显示垂直滚动指示器

self.scrollView.showVerticalScrollIndicator = NO;

——————————————————————————————————————————————

常用代理方法:
滚动相关的方法:
•(void) scrollViewDidScroll:(UIScrollView *)scrollView;
–用户在滚动的时候
•- (void) scrollViewWillBeginDragging:( UIScrollView *)scrollView;
–用户即将开始拖拽的时候
•- (void) scrollViewDidEndDragging:( UIScrollView *)scrollView;
–用户拖拽完毕以后
——————————————————————————————————————————————
缩放相关的方法:
Ø即将开始缩放的时候调用

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


Ø正在缩放的时候调用
-( void)scrollViewDidZoom:( UIScrollView *)scrollView

Ø缩放完毕的时候调用

-(void)scrollViewDidEndZooming::(UIScrollView *)scrollView


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
•如果UIScrollView无法滚动,可能是以下原因:
没有设置contentSize
scrollEnabled = NO
没有接收到触摸事件:userInteractionEnabled = NO
没有取消 autolayout功能(要想scrollView滚动,在xcode5.x 下必须取消autolayout) 注意 : xcode6.1 下不需要取消自动布局也可以滚动。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
附加内容:

分页指示器控件:UIPageControl
self.pageControl.numberOfPages = 5;  // 一共有5页
UIPageControl常用属性如下
Ø一共有多少页

@property(nonatomic)NSInteger    numberOfPages;

self.pageControl.numberOfPages = 5;  // 一共有5页


Ø当前显示的页码

@property(nonatomic)NSInteger    currentPage;

self.pageControl.currentPage = 0; // 当前是第0页


Ø只有一页时,是否需要隐藏页码指示器

@property(nonatomic)BOOL    hidesForSinglePage;


Ø其他页码指示器的颜色

@property(nonatomic,retain)UIColor    *pageIndicatorTintColor;


Ø当前页码指示器的颜色

@property(nonatomic,retain)UIColor    *currentPageIndicatorTintColor;


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NSTimer计时器控件:
//NSTimer一般用于定时的更新一些非界面上的数据
//使用该定时器会出现卡顿的现象

初始化:

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


解释:

scheduledTimerWithTimeInterval:(NSTimeInterval)seconds  

预订一个Timer,设置一个时间间隔。

表示输入一个时间间隔对象,以秒为单位,一个>0的浮点类型的值,如果该值<0,系统会默认为0.1


 target:(id)aTarget

表示发送的对象,如self


 selector:(SEL)aSelector

方法选择器,在时间间隔内,选择调用一个实例方法


userInfo:(id)userInfo

此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。


repeats:(BOOL)yesOrNo

YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。


停止

- (void)invalidate;

这个是唯一一个可以将计时器从runloop中移出的方法。(移除之后该计时器就废了,要想使用得重新创建一个


例子:创建一个NSTimer计时器

self.time = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(next) userInfo:nil repeats:YES];


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

改变计时器的优先级:

    // 获取当前的消息循环对象

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    // 修改self.time的优先级

    [runLoop addTimer:self.time forMode:NSRunLoopCommonModes];


所有控件的默认优先级都是 NSRunLoopCommonModes , 但是网络和计时器对象默认的优先级要比控件的优先级低是 NSDefaultRunLoopMode  ,要使计时器不受其他控件的影响需把计时器的优先级调到与控件的优先级一样既NSRunLoopCommonModes

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CADisplayLink计时器(刷帧) :默认一秒执行60次(与屏幕的刷新频率一样)


创建一个计时器:

// CADisplayLink 定时器一秒执行60

CADisplayLink *link = [CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(setNeedsDisplay)]; 

// CADisplayLink 定时器创建好以后默认不执行,要执行定时器,得添加到主运行循环

[link addToRunLoop:[NSRunLoopmainRunLoop] forMode:NSDefaultRunLoopMode];


停止计时器:(一停就废了)

[self.linkinvalidate];

self.link =nil;

// 移除主运行循环,不需要手写,因为invalidate方法,内部会把主定时,从主运行循环移除

//[self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值