初識(shí)UIScrollView
什么是UIScrollView?
- 移動(dòng)設(shè)備的屏幕大小是極其有限的,當(dāng)展示的內(nèi)容較多的時(shí)候,超出一個(gè)屏幕時(shí),用戶可以通過(guò)滾動(dòng)手勢(shì)來(lái)查看屏幕以外的內(nèi)容
- UIScrollview是一個(gè)能夠滾動(dòng)的視圖控件,可以用來(lái)展示大量的內(nèi)容.
UIScrollView的基本使用
- 將需要展示的內(nèi)容添加到UIScrollview中
- 設(shè)置UIScrollview的contentSize屬性,告訴UIScrollview所內(nèi)容的尺寸----就是滾動(dòng)的范圍
- UIScrollview顯示內(nèi)容的小細(xì)節(jié)
- 超出UIScrollview邊框的內(nèi)容會(huì)被自動(dòng)隱藏
- 用戶可以用手勢(shì)拖動(dòng)來(lái)查看超出邊框并被隱藏的內(nèi)容
UIScrollView無(wú)法滾動(dòng)的原因
- 沒(méi)有設(shè)置contentSize
- scroEnabled = NO;
- 沒(méi)有接收到觸摸事件:userInteractionEnabled = NO;
UIScrollView的屬性
關(guān)于顯示內(nèi)容的
表示UIScrollView滾動(dòng)的位置
(就是內(nèi)容左上角與scrollView左上角的間距!!)
@property (nonatomic) CGPoint contentOffset;
表示UIScrollView內(nèi)容的尺寸,滾動(dòng)范圍(能滾多遠(yuǎn))
@property (nonatomic) CGSize contentSize;
在UIScrollView的四周增加額外的滾動(dòng)區(qū)域,一般用來(lái)避免scrollView的內(nèi)容被其他控件擋住
@property (nonatomic) UIEdgeInsets contentInset;
其他屬性,效果or滾動(dòng)條
設(shè)置UIScrollView是否需要彈簧效果
@property (nonatomic) BOOL bounces;
設(shè)置UIScrollView是否能滾動(dòng)
@property (nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
是否顯示水平滾動(dòng)條
@property (nonatomic) BOOL showsHorizontalScrollIndicator;
是否顯示垂直滾動(dòng)條
@property (nonatomic) BOOL showsVerticalScrollIndicator;
UIScrollView的代理
在很多時(shí)候我們需要知道UIScrollView滾動(dòng)到了那里,它是否停止,那些時(shí)候來(lái)做一些特定的操作,要想完成那些特定的動(dòng)作進(jìn)行時(shí)的功能,前提就是能夠監(jiān)聽(tīng)到UIScrollView整個(gè)滾動(dòng)的過(guò)程
要想監(jiān)聽(tīng)整個(gè)UIScrollView的滾動(dòng)過(guò)程,就必須給它設(shè)置一個(gè)代理對(duì)象,通過(guò)代理得知UIScrollView的滾動(dòng)過(guò)程
UIScrollView和delegate的通信
- UIScrollView和delegate的通信應(yīng)該如下表:
手勢(shì) | 方法 |
---|---|
開(kāi)始拖拽 | scrollViewWillBeginDragging: |
具體到某個(gè)位置 | scrollViewDidScroll: |
用戶停止拖拽 | scrollViewDidEndDragging:willDecelerate: |
UIScrollView需要實(shí)現(xiàn)的方法都定義在UIScrollViewDelegate協(xié)議中,遵守協(xié)議后,實(shí)現(xiàn)協(xié)議中的方法就可以監(jiān)聽(tīng)UIScrollView的滾動(dòng)過(guò)程
UIscrollView和控制器
- 一般情況下,就設(shè)置UIScrollView所在的控制器為UIScrollView的delegate
- 設(shè)置代理的方法有兩種:
- 通過(guò)代碼來(lái)設(shè)置----
self.scrollView.delegate = self;
- 通過(guò)storyboard拖線
- 通過(guò)代碼來(lái)設(shè)置----
UIscrollView中內(nèi)容的縮放
- 原理:當(dāng)用戶在UIScrollView身上使用捏合手勢(shì)時(shí),UIScrollView會(huì)給代理發(fā)送一條消息,詢問(wèn)代理究竟要縮放自己內(nèi)部哪一塊
- UIScrollView身上使用捏合手勢(shì)時(shí),調(diào)用
viewForZoomingInScrollView:
這個(gè)方法返回的控件就是需要進(jìn)行縮放的控件
縮放實(shí)現(xiàn)步驟
- 設(shè)置UIScrollView的
id<UIScrollViewDelegate>delegate
代理對(duì)象 - 設(shè)置
minimumZoomScale:
縮小的最小的比例 - 設(shè)置
maximumZoomScale:
放大的最大的比例 - 讓代理對(duì)象實(shí)現(xiàn)下面的方法,返回需要縮放的視圖控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
跟縮放相關(guān)的其他代理方法
即將開(kāi)始縮放的時(shí)候調(diào)用
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view;
正在縮放的時(shí)候調(diào)用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView;
分頁(yè)
- 只要將
UIScrollView
的pageEnable
屬性設(shè)置為YES,UIScrollView會(huì)被分割成多個(gè)獨(dú)立頁(yè)面,里面的內(nèi)容就能進(jìn)行分頁(yè)展示 - 一般會(huì)配合
UIPageControl
增強(qiáng)分頁(yè)效果,UIPageControl
常用屬性如下:
一共有多少頁(yè)
@property (nonatomic) NSInteger numberOfPages;
當(dāng)前顯示的頁(yè)碼
@property (nonatomic) NSInteger currentPage;
只有一頁(yè)的時(shí)候,是否需要隱藏頁(yè)碼指示器
@property (nonatomic)BOOL hidesForSinglePage;
其他頁(yè)碼的顏色
@property (nonatomic,retain) UIColor *pageIndicatorTintColor;
當(dāng)前頁(yè)碼指示器的顏色
@property (nonatomic,retain) UIColor *currentPageIndicatorTintColor;
NSTimer
NSTimer叫做定時(shí)器
- 在制定的時(shí)間執(zhí)行任務(wù)
- 每隔一段時(shí)間執(zhí)行指定的任務(wù)
調(diào)用下面的方法就會(huì)開(kāi)啟一個(gè)定時(shí)的任務(wù)
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeINterval)ti target:(id)aTarget selector:(SEL)aselector userInfo:(id)userInfo repeats :(BOOL)yes or no;
每隔ti秒,調(diào)用一次aTarget的aSelector方法,yesOrno決定了是否重復(fù)執(zhí)行任務(wù)
- 解決定時(shí)器在主線程不工作的的問(wèn)題
NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];