什么是UIScrollView?
移動設(shè)備的屏幕大小是極其有限的岁疼,因此直接展示在用戶眼前的內(nèi)容也相當(dāng)有限
當(dāng)展示的內(nèi)容較多抒巢,超出一個屏幕的時候互亮,用戶可通過滾動手勢來查看屏幕以外的內(nèi)容
普通的UIView不具備滾動功能寿烟,不適合顯示過多的內(nèi)容
UIScrollView是一個能夠滾動的視圖控件淑际,可以用來展示大量的內(nèi)容脸侥,并且可以通過滾動查看所有的內(nèi)容
UIScrollView的基本使用
UIScrollView的用法:
- 將需要展示的內(nèi)容添加到UIScrollView中
- 設(shè)置UIScrollView的contenSize屬性建邓,告訴UIScrollView所有內(nèi)容的尺寸,也就是告訴它滾動的范圍(能滾多遠(yuǎn)睁枕,滾到那里是盡頭)
UIScrollView顯示內(nèi)容的細(xì)節(jié)
- 超出UIScrollView邊框的內(nèi)容會被自動隱藏
- 用戶可以通過手勢拖動來查看超出邊框被隱藏的內(nèi)容
UIScrollView常見問題:無法滾動的解決辦法
- 沒有設(shè)置contentSize
- scrollEnabled = NO
- 沒有接收到觸摸事件:userInteractionEnabled = NO
- 其他
UIScrollView的常見屬性
@property(nonatomic) CGPoint contenOffset;
- 這個屬性用來表示UIScrollView滾動的位置 (其實就是內(nèi)容左上角與scrollview左上角的間距值)
@property(nonatomic) CGSize contenSize;
- 這個屬性用來表示UIScrollView內(nèi)容的尺寸官边,滾動范圍(能滾動多遠(yuǎn))
@property(nonatomic) UIEageInsets contenInset;
- 這個屬性能夠在UIScrollView的四邊增加額為的滾動區(qū)域,一般用來避免scrollView的內(nèi)容被其他控件擋住
UIScrollView的其他屬性
@property(nonatomic) BOOL bounces;
- 設(shè)置UIScrollView是否需要彈簧效果
@property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled
- 設(shè)置UIScrollView是否能滾動
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
- 設(shè)置是否顯示水平滾動條
@property(nonatomic) BOOL showsVerticalScrollIndicator;
- 設(shè)置是否顯示垂直滾動條
UIScrollView的代理
我們想在UIScrollView正在滾動或者滾動到每個位置或者 停止?jié)L動時做一些特定的操作
想要完成上述功能外遇,前提條件就是能夠監(jiān)聽到UIScrollView的整個滾動過程
當(dāng)UIScrollView發(fā)生一系列的滾動操作時注簿,會自動通知它的代理(delegate)對象,給代理發(fā)送相應(yīng)的消息跳仿,讓代理得知它的滾動情況
要像監(jiān)聽UIScrollView的滾動過程诡渴,就必須先給UIScrollView設(shè)置一個代理對象,然后通過代理對象監(jiān)聽UIScrollView的滾動過程
- 用戶開始拖拽時菲语,調(diào)用scrollViewWillBeginDragging:方法
- 具體滾動到某個位置的時候妄辩,調(diào)用scrollViewDidScroll:方法
- 用戶停止拖拽的時候,調(diào)用scrollViewDidEndDragging:willDecelerate:方法
- 想要設(shè)置UIScrollView的delegate,必須遵守代理協(xié)議山上,并且實現(xiàn)協(xié)議規(guī)定的方法眼耀,才能監(jiān)聽UIScrollView的滾動過程
- UIScrollView將delegate想要實現(xiàn)的方法都定義在了UIScrollViewDelegate協(xié)議中 - 一般情況下,就設(shè)置UIScrollView所在的控制器為它的delegate
內(nèi)容的縮放
有些時候胶哲,我們會想要對某些內(nèi)容進(jìn)行手勢縮放
UIScrollView不僅能滾動顯示大量內(nèi)容畔塔,還能對其內(nèi)容進(jìn)行縮放處理
要完成縮放功能,只想要將想要縮放的內(nèi)容添加到UIScrollView中
當(dāng)用戶在UIScrollView上使用捏合手勢時鸯屿,UIScrollView會調(diào)用代理的viewForZoomingInScrollView:方法,這個方法返回的控件就是需要進(jìn)行縮放的控件
實現(xiàn)縮放步驟
- 設(shè)置UIScrollView的id?delegare代理對象
- 設(shè)置minimumZoomScale: 縮小的最小比例
- 設(shè)置maximumZoomScale: 放大的最大比例
-
讓代理對象實現(xiàn)如下的方法把敢,返回需要縮放的視圖控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
-
和縮放相關(guān)的其他代理方法
// 整在縮放的時候調(diào)用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView // 開始縮放的時候調(diào)用 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view // 縮放結(jié)束的時候調(diào)用 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
分頁
只要將UIScrollView的pagingEnabled屬性設(shè)置為YES寄摆,UIScrollView會被分割成多個獨立頁面,里面的內(nèi)容就能進(jìn)行分頁展示
一般會配合UIPageControl增強分頁效果修赞,UIPageControl常用屬性如下
// 一共有多少頁
@property(nonatomic) NSInteger numberOfPages;
// 當(dāng)前顯示的頁碼
@property(nonatomic) NSInteger currentPage;
// 只有一頁時婶恼,是否需要隱藏頁碼指示器
@property(nonatomic) BOOL hidesForSinglePage;
// 其他頁碼指示器的顏色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
// 當(dāng)前頁碼指示器的顏色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
NSTimer
NSTimer叫做“定時器”桑阶,它的作用如下
- 在指定的時間執(zhí)行指定的任務(wù)
- 每隔一段時間執(zhí)行指定的任務(wù)
調(diào)用下面的方法就會開啟一個定時任務(wù)
// 每隔ti秒,調(diào)用一次aTarget的aSelector方法勾邦,yesOrNo決定了是否重復(fù)執(zhí)行這個任務(wù)
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo;
通過invalidate方法可以停止定時器的工作蚣录,一旦定時器被停止了,就不能再次執(zhí)行任務(wù)眷篇。只能再創(chuàng)建一個新的定時器才能執(zhí)行新的任務(wù)
- (void)invalidate;
解決定時器在主線程不工作的問題萎河,有時候需要幾個控件同時工作
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];