ios主流控件的使用說明之ScrollView

關(guān)于UIStrollview:

UIScrollView無法滾動(dòng)可能的原因及解決辦法:

?沒有設(shè)置contentSize

?scrollEnabled=NO

?沒有接收到觸摸事件:userInteractionEnabled=NO

?沒有取消autolayout功能(要想scrollView滾動(dòng)伤疙,在xcode5.x下必須取消autolayout)注意:在xcode6.1下不需要取消自動(dòng)布局也可以滾動(dòng)旷余。但是從Xcode7開始系統(tǒng)建議我們使用AutoLayout來布局UIScorllView

?UIScrollView的frame.size與contentSize的區(qū)別?

–frame.size指的是:UIScrollView的可視區(qū)域的大小,UIScrollView本身的大小

–contentSize指的是:UIScrollView中所包含的內(nèi)容的大小(要滾動(dòng)的實(shí)際內(nèi)容的大小)

?把frame.size和contentSize設(shè)置都一樣了,還能滾動(dòng)嗎?如果contentSize比frame.size小還能滾動(dòng)嗎?

?總結(jié):在UIScrollView的frame.size這么大的范圍內(nèi),要顯示contentSize這么大的內(nèi)容揍移。是否需要滾動(dòng),取決于contentSize是否比frame.size大乘粒。

?@property(nonatomic)CGPointcontentOffset;幢妄?

?屬性含義:–1>當(dāng)UIScrollView內(nèi)部的內(nèi)容滾動(dòng)時(shí),內(nèi)容相對(duì)于UIScrollView左上角的偏移

? ? ? ? ? ? ? ? ? –2>另一種理解方式:內(nèi)容滾動(dòng)到了什么位置

?通過點(diǎn)擊按鈕,實(shí)現(xiàn)大圖自動(dòng)滾動(dòng)(修改contentOffset)着裹?

?1.直接實(shí)現(xiàn),直接修改contentOffset沒有動(dòng)畫效果

?2.通過UIView的動(dòng)畫方法實(shí)現(xiàn)

?3.通過調(diào)用UIScrollView的setContentOffset:animated:來實(shí)現(xiàn)帶動(dòng)畫效果的滾動(dòng)。

?@property(nonatomic)UIEdgeInsetscontentInset;瑰妄?

?含義:

?內(nèi)容的內(nèi)邊距

?設(shè)置UIScrollView的內(nèi)容在拖動(dòng)以后,內(nèi)容距離UIScrollView的內(nèi)邊距陷嘴。(聯(lián)想按鈕的內(nèi)邊距屬性:Inset)

?另一種思考方式:想象成把內(nèi)容加大了,在內(nèi)容本身的周圍加了一圈”外邊距”。

UIScrollView的其他屬性间坐?

?@property(nonatomic)BOOLbounces;

?設(shè)置UIScrollView是否需要彈簧效果

?@property(nonatomic,getter=isScrollEnabled)BOOLscrollEnabled;

?設(shè)置UIScrollView是否能滾動(dòng)

?@property(nonatomic)BOOLshowsHorizontalScrollIndicator;

?是否顯示水平滾動(dòng)條

?@property(nonatomic)BOOLshowsVerticalScrollIndicator;

?是否顯示垂直滾動(dòng)條

如何做一個(gè)電臺(tái)參考步驟灾挨?

?1>拖拽一個(gè)UIScrollView到控制器view,設(shè)置該UIScrollView大小與控制器view一致

?2>設(shè)置該UIScrollView的背景色為RGB:212,212,212

?3>向UIScrollView中增加內(nèi)容

?4>設(shè)置UIScrollView的contentSize的height為最下面的圖片的最大的Y值,width為0(因?yàn)闄M向不滾動(dòng))

?提示:某個(gè)方向上不希望滾動(dòng),則把該方向上的contentSize的值設(shè)置為0

?5>向控制器的view中添加一個(gè)UIView到最上方,模擬"導(dǎo)航欄”

?注意:直接拖拽UIView到UIScrollView上,就導(dǎo)致UIView隨著UIScrollView進(jìn)行滾動(dòng),

這個(gè)UIView不屬于UIScrollView所以拖拽的時(shí)候最好拖拽到Scene(場(chǎng)景)上。在viewDidLoad中設(shè)置contentOffset的y值,為-64(設(shè)置默認(rèn)滾動(dòng)的位置).

?6>在最底部拖拽一個(gè)UIView,模擬”底部菜單”,高度為44

?7>設(shè)置頂部"導(dǎo)航欄UIView"與 底部"菜單欄UIView"的alpha= 0.7(設(shè)置透明度)

?8>設(shè)置contentInset屬性的top和bottom的值,在滾動(dòng)后預(yù)留一定的內(nèi)邊距

?注意:獲取某個(gè)控件的最大的Y值:CGRectGetMaxY(self.lastButton.frame);

?9>設(shè)置一開始就滾動(dòng)到某個(gè)位置,通過contentOffset屬性實(shí)現(xiàn)

?注意這里要把y值設(shè)置為負(fù)數(shù)

實(shí)現(xiàn)滾動(dòng)的時(shí)候輸出當(dāng)前滾動(dòng)的位置眶诈?

思考:

1.獲取當(dāng)前滾動(dòng)的位置:scrollView.contentOffset

2.要想實(shí)現(xiàn)滾動(dòng)的時(shí)候顯示當(dāng)前滾動(dòng)的位置,那么就一定要監(jiān)聽滾動(dòng)事件涨醋。

3.問題:如何監(jiān)聽滾動(dòng)事件?答:通過代理來監(jiān)聽逝撬。

監(jiān)聽事件的另外一種方式:代理浴骂。之前學(xué)過的一種方式是:addTarget的方式。

用戶開始拖拽時(shí)宪潮,調(diào)用scrollViewWillBeginDragging:方法

具體滾動(dòng)到某個(gè)位置時(shí)溯警,調(diào)用scrollViewDidScroll:方法

用戶停止拖拽時(shí),調(diào)用scrollViewDidEndDragging:willDecelerate:方法

也就是說, 只要設(shè)置好了UIScrollView的代理對(duì)象,那么當(dāng)某個(gè)事件被觸發(fā)以后,系統(tǒng)會(huì)自動(dòng)調(diào)用代理對(duì)象的相應(yīng)方法狡相。我們要關(guān)心的就是如何設(shè)置代理,其他細(xì)節(jié)無需關(guān)心梯轻。

?UIScrollView將delegate需要實(shí)現(xiàn)的方法都定義在了UIScrollViewDelegate協(xié)議中,因此要想成為UIScrollView的delegate尽棕,必須遵守UIScrollViewDelegate協(xié)議喳挑,然后實(shí)現(xiàn)協(xié)議中相應(yīng)的方法,就可以監(jiān)聽UIScrollView的滾動(dòng)過程了

代理設(shè)計(jì)模式的作用總結(jié):

?1.監(jiān)聽事件(返回來就是"通知")

–1>scrolView發(fā)生某某事件后,通知代理對(duì)象的某個(gè)方法

–2>代理對(duì)象的某個(gè)方法監(jiān)聽scrollView的某個(gè)事件(狀態(tài)發(fā)生改變)

?2.回傳數(shù)據(jù)

?總結(jié):代理設(shè)計(jì)模式最終的目的就是”解耦”伊诵。

當(dāng)用戶在UIScrollView身上使用捏合手勢(shì)時(shí)单绑,UIScrollView會(huì)調(diào)用代理的viewForZoomingInScrollView:方法,這個(gè)方法返回的控件就是需要進(jìn)行縮放的控件

注意:UIScrollView 一次只能縮放一個(gè)子控件曹宴。

實(shí)現(xiàn)圖片縮放的具體步驟:

?1.添加UIScrollView,設(shè)置UIScrollView的寬和高與控制器大小一致

?2.向UIScrollView中添加子控件UIImageView,設(shè)置圖片,設(shè)置UIImageView的大小與圖片的實(shí)際大小一致搂橙。

?3.設(shè)置UIScrollView的代理為當(dāng)前控制器

?4.設(shè)置當(dāng)前控制器遵守UIScrollViewDelegate代理協(xié)議

?5.在控制器中實(shí)現(xiàn)代理方法

–-(UIView*)viewForZoomingInScrollView:方法返回要縮放的子控件

?6.在viewDidLoad中設(shè)置縮放比例

–self.scrollView.maximumZoomScale=2.0;

–self.scrollView.minimumZoomScale=0.4;

?**解釋UIScrollViewDelegate中的@optional關(guān)鍵字、@required關(guān)鍵字

?即將開始縮放的時(shí)候調(diào)用

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

?正在縮放的時(shí)候調(diào)用-(void)scrollViewDidZoom:(UIScrollView*)scrollView

?縮放完畢的時(shí)候調(diào)用-(void)scrollViewDidEndZooming::(UIScrollView *)scrollView

圖片輪播器:

?實(shí)現(xiàn)思路:

–1.添加UIScrollView

–2.動(dòng)態(tài)向UIScrollView中添加圖片框(橫向)

–3.設(shè)置UIScrollView的contentSize實(shí)現(xiàn)滾動(dòng),實(shí)現(xiàn)橫向滾動(dòng)

–4.實(shí)現(xiàn)分頁

–5.實(shí)現(xiàn)分頁指示器UIPageControl

–6.通過使用Nstimer實(shí)現(xiàn)自動(dòng)滾動(dòng)

圖片輪播器實(shí)現(xiàn)具體步驟

?1.創(chuàng)建一個(gè)UIScrollView,設(shè)置寬為300,高為130(與每張圖片的大小一致)

?2.向UIScrollView中添加內(nèi)容(要滾動(dòng)的內(nèi)容,添加到UIScrollView的子控件集合中)–循環(huán)添加5個(gè)UIImageView,設(shè)置圖片,設(shè)置frame

?3.設(shè)置UIScrollView的contentSize的width為5個(gè)圖片的總大小,上下不滾動(dòng)所以height為0

?4.去掉水平滾動(dòng)條

–self.scrollView.showsHorizontalScrollIndicator= NO;

?5.實(shí)現(xiàn)自動(dòng)分頁–self.scrollView.pagingEnabled=YES;

?問題:設(shè)置完pagingEnabled=YES以后笛坦,scrollView是怎么知道該如何分頁的?

–答:按照UIScrollView自身的寬度來實(shí)現(xiàn)分頁的.UIScrollView的寬度就是每頁的大小区转。

?6.顯示分頁指示器

–1>通過UIPageControl來實(shí)現(xiàn)

–2>拽一個(gè)UIPageControl放到控制器的view中,不要放到UIScrollView中,否則就一起滾動(dòng)了.

–3>設(shè)置UIPageControl的TintColor(其他頁顏色)和CurrentPage(當(dāng)前頁顏色)屬性顏色

?注意:當(dāng)把UIPageControl添加到控制器的view中的時(shí)候,這個(gè)控件和UIScrollView根本沒有任何聯(lián)系,所以沒有分頁指示功能

?7.實(shí)現(xiàn)分頁指示器總頁數(shù)、當(dāng)前頁版扩。–總頁數(shù):numberOfPages屬性

?self.pageControl.numberOfPages=imageCount;–當(dāng)前頁:currentPage屬性

?self.pageControl.currentPage= 0;

?注意:

–在viewDidLoad中設(shè)置總頁數(shù)

–在-(void)scrollViewDidScroll:代理方法中設(shè)置當(dāng)前頁

–設(shè)置當(dāng)前頁的思路:?通過當(dāng)前的滾動(dòng)的偏移值來計(jì)算出當(dāng)前滾動(dòng)到第幾頁了

?8.通過定時(shí)器(NSTimer)實(shí)現(xiàn)自動(dòng)滾動(dòng)

–在viewDidLoad中啟動(dòng)定時(shí)器?啟動(dòng)定時(shí)器的兩種方法:

?1>調(diào)用timerWithXxx創(chuàng)建的timer废离,把這個(gè)timer對(duì)象手動(dòng)加到”消息循環(huán)”中才能啟動(dòng)

?2>調(diào)用scheduledTimerWithXxx創(chuàng)建的timer,自動(dòng)啟動(dòng)(創(chuàng)建完畢后自動(dòng)啟動(dòng))资厉。

?9.在定時(shí)器的方法中實(shí)現(xiàn)滾動(dòng) ? –思路1:

–1>通過UIPageControl獲取當(dāng)前頁數(shù),并讓頁數(shù)+1

–2>根據(jù)加1以后的頁數(shù)乘以每頁的寬度(每張圖片寬度)計(jì)算出contentOffset.x的偏移值

–3>手動(dòng)設(shè)置偏移值,實(shí)現(xiàn)滾動(dòng)(通過動(dòng)畫方式設(shè)置).

?10.解決Bug

–Bug:當(dāng)拖拽UIScrollView的時(shí)候,保持一段時(shí)間不松手的時(shí)候,一旦松手UIScrollView會(huì)連續(xù)滾動(dòng)多次厅缺。

–解決思路:在即將拖拽的時(shí)候,停止計(jì)時(shí)器,拖拽完畢后再打開一個(gè)計(jì)時(shí)器蔬顾。

?**停止計(jì)時(shí)器:調(diào)用NSTimer對(duì)象的invalidate方法(當(dāng)某個(gè)計(jì)時(shí)器被停止以后,就無法再重用了,下次必須再重新創(chuàng)建一個(gè)新的計(jì)時(shí)器)宴偿。[self.timerinvalidate];

?-(void)scrollViewWillBeginDragging:

?-(void)scrollViewDidEndDragging:

?11.解決Bug

–Bug:當(dāng)單擊(拖拽)界面上的某個(gè)其他控件的時(shí)候,UIScrollView停止?jié)L動(dòng)的問題。

?產(chǎn)生Bug的原因:

–當(dāng)前處理UI界面的只有一個(gè)線程,當(dāng)這個(gè)線程處理UI的拖動(dòng)事件的時(shí)候就沒有能力再去處理滾動(dòng)操作了

–注意:處理UI界面的的只能是一個(gè)線程诀豁。所以,處理UIScrollView的滾動(dòng)和其他控件的拖拽,只能用同一個(gè)線程窄刘。如果多個(gè)線程都可以操作UI那么就會(huì)造成混亂的問題

?解決思路:提高處理滾動(dòng)的timer的優(yōu)先級(jí)。

?注意:所有控件的默認(rèn)優(yōu)先級(jí)都是NSRunLoopCommonModes,但是網(wǎng)絡(luò)和計(jì)時(shí)器對(duì)象默認(rèn)的優(yōu)先級(jí)要比控件的優(yōu)先級(jí)低是NSDefaultRunLoopMode,所以這里要把計(jì)時(shí)器的優(yōu)先級(jí)調(diào)整為與控件一樣的優(yōu)先級(jí)NSRunLoopCommonModes舷胜。

12娩践、分頁

?只要將UIScrollView的pageEnabled屬性設(shè)置為YES,UIScrollView會(huì)被分割成多個(gè)獨(dú)立頁面烹骨,里面的內(nèi)容就能進(jìn)行分頁展示

?一般會(huì)配合UIPageControl增強(qiáng)分頁效果翻伺,UIPageControl常用屬性如下

?一共有多少頁

@property(nonatomic) NSInteger numberOfPages;

?當(dāng)前顯示的頁碼

@property(nonatomic) NSInteger currentPage;

?只有一頁時(shí),是否需要隱藏頁碼指示器

@property(nonatomic) BOOL hidesForSinglePage;

?其他頁碼指示器的顏色

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

?當(dāng)前頁碼指示器的顏色

@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

13.NSTimer

?NSTimer叫做“定時(shí)器”沮焕,它的作用如下

?在指定的時(shí)間執(zhí)行指定的任務(wù)

?每隔一段時(shí)間執(zhí)行指定的任務(wù)

?調(diào)用下面的方法就會(huì)開啟一個(gè)定時(shí)任務(wù)

+(NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)titarget:(id)aTarget

selector:(SEL)aSelector

userInfo:(id)userInforepeats:(BOOL)yesOrNo;

每隔ti秒吨岭,調(diào)用一次aTarget的aSelector方法,yesOrNo決定了是否重復(fù)執(zhí)行這個(gè)任務(wù)

?通過invalidate方法可以停止定時(shí)器的工作峦树,一旦定時(shí)器被停止了辣辫,就不能再次執(zhí)行任務(wù)。只能再創(chuàng)建一個(gè)新的定時(shí)器才能執(zhí)行新的任務(wù)

-(void)invalidate;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魁巩,一起剝皮案震驚了整個(gè)濱河市急灭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谷遂,老刑警劉巖葬馋,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畴嘶,警方通過查閱死者的電腦和手機(jī)扫尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掠廓,“玉大人换怖,你說我怎么就攤上這事◇扒疲” “怎么了沉颂?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悦污。 經(jīng)常有香客問我铸屉,道長(zhǎng),這世上最難降的妖魔是什么切端? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任彻坛,我火速辦了婚禮,結(jié)果婚禮上踏枣,老公的妹妹穿的比我還像新娘昌屉。我一直安慰自己,他們只是感情好茵瀑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布间驮。 她就那樣靜靜地躺著,像睡著了一般马昨。 火紅的嫁衣襯著肌膚如雪竞帽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天鸿捧,我揣著相機(jī)與錄音屹篓,去河邊找鬼。 笑死匙奴,一個(gè)胖子當(dāng)著我的面吹牛堆巧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饥脑,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼恳邀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了灶轰?” 一聲冷哼從身側(cè)響起谣沸,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笋颤,沒想到半個(gè)月后乳附,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體内地,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年赋除,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阱缓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡举农,死狀恐怖荆针,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颁糟,我是刑警寧澤航背,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站棱貌,受9級(jí)特大地震影響玖媚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婚脱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一今魔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧障贸,春花似錦错森、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督函。三九已至嘀粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辰狡,已是汗流浹背锋叨。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宛篇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓叫倍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吆倦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子听诸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容