我們?cè)陂_(kāi)發(fā)一些項(xiàng)目的首頁(yè),或者需要信息展示類(lèi)界面的時(shí)候拂封,往往需要用到無(wú)限滾動(dòng)視圖效果茬射,如果每次都要自己寫(xiě)的話(huà),確實(shí)比較費(fèi)勁麻煩一些冒签,筆者秉著簡(jiǎn)單易調(diào)用在抛,功能完備的原則,將無(wú)限滾動(dòng)視圖封裝了一下萧恕,分享給各位觀眾老爺們刚梭,即便是新手,導(dǎo)入頭文件票唆,兩行代碼調(diào)用也可以輕松實(shí)現(xiàn)無(wú)限滾動(dòng)視圖的調(diào)用朴读。
本文主要介紹該框架的使用方法以及相應(yīng)API調(diào)用,文章底部提供demo鏈接走趋,以及實(shí)現(xiàn)原理講解衅金。
先上效果圖:
倆句調(diào)用代碼:
//加載滾動(dòng)視圖
_roundScrollView=[SZKRoundScrollView roundScrollViewWithFrame:CGRectMake(0, 100, SCREEN_WIDTH, 200) imageArr:self.localImageArr timerWithTimeInterval:5 imageClick:^(NSInteger imageIndex) {
NSLog(@"imageIndex:第%ld個(gè)",imageIndex);
//在此添加點(diǎn)擊圖片后的操作
}];
[self.view addSubview:_roundScrollView];
使用簡(jiǎn)介:
導(dǎo)入SZKRoundScrollView.h頭文件,傳入相應(yīng)的坐標(biāo)frame,圖片數(shù)組(包括網(wǎng)絡(luò)和本地圖片)簿煌,定時(shí)器時(shí)間(給定時(shí)間內(nèi)自動(dòng)向右滑動(dòng)氮唯,如果不需要定時(shí)器的功能可以將該時(shí)間設(shè)置為-1或者比較大的數(shù)),imageClick中可以添加點(diǎn)擊圖片后的操作姨伟,添加代碼 [self.view addSubview:_roundScrollView];將視圖添加到界面上惩琉,便可以實(shí)現(xiàn)無(wú)限滾動(dòng)視圖啦。
API簡(jiǎn)介:
typedef enum : NSUInteger {
NSPageControlAlignmentCenter,//中間位置
NSPageControlAlignmentRight,//右邊位置
} NSPageControlAlignment;
@interface SZKRoundScrollView : UIView
/**
* 小圓點(diǎn)控制器的位置
*/
@property(nonatomic)NSPageControlAlignment pageControlAlignment;
/**
* 當(dāng)前小圓點(diǎn)顏色
*/
@property(nonatomic,retain)UIColor *curPageControlColor;
/**
* 其余小圓點(diǎn)顏色
*/
@property(nonatomic,retain)UIColor *otherPageControlColor;
為了提高此框架的健壯性夺荒,筆者提供了以上幾個(gè)屬性瞒渠,可以修改小圓點(diǎn)控制器位置和顏色,位置提供中間和最右邊倆個(gè)位置般堆,默認(rèn)為中間位置在孝。如果各位觀眾老爺還有其他需求,筆者以后慢慢添加淮摔。
//可以修改的屬性
//小圓點(diǎn)控制器位置
_roundScrollView.pageControlAlignment=NSPageControlAlignmentCenter;
//當(dāng)前小圓點(diǎn)顏色
_roundScrollView.curPageControlColor=[UIColor yellowColor];
//其余小圓點(diǎn)顏色
_roundScrollView.otherPageControlColor=[UIColor orangeColor];
除了提供一些屬性外私沮,還提供了倆個(gè)用來(lái)開(kāi)啟和暫停定時(shí)器的方法,
/**
* 暫停定時(shí)器
*/
-(void)pasueTimer;
/**
* 開(kāi)啟定時(shí)器
*/
-(void)startTimer;
因?yàn)榇丝蚣苣J(rèn)開(kāi)啟定時(shí)器和橙,進(jìn)入該頁(yè)面后定時(shí)器會(huì)一直運(yùn)行仔燕,如果進(jìn)入其他頁(yè)面時(shí),可以手動(dòng)關(guān)閉停止器魔招,回到該頁(yè)面時(shí)晰搀,可以重新開(kāi)啟定時(shí)器,算是優(yōu)化性能办斑,節(jié)約內(nèi)存吧外恕。
實(shí)現(xiàn)的方法及原理:
實(shí)現(xiàn)無(wú)限滾動(dòng)視圖的方法大體上分為倆種杆逗,一種是利用collectionView實(shí)現(xiàn)無(wú)限滾動(dòng),因?yàn)閏ollectionView本身存在著復(fù)用的問(wèn)題鳞疲,所以不用擔(dān)心內(nèi)存的消耗問(wèn)題罪郊,就是使用的時(shí)候代碼相對(duì)比較多一點(diǎn),如果感興趣的朋友可以自己研究一下尚洽。
另外一種就是基于scrollView來(lái)實(shí)現(xiàn)啦悔橄,比如我們現(xiàn)在有5張圖片,最簡(jiǎn)單的就是我們直接創(chuàng)建5+2個(gè)腺毫,也就是7個(gè)imageView癣疟,而我們的存放順序?yàn)椋瑘D片5潮酒,圖片1睛挚,圖片2,圖片3澈灼,圖片4竞川,圖片5,圖片1叁熔。默認(rèn)顯示第2張(圖片1)委乌,一直向右滑動(dòng)到第6張(圖片5),再向右滑動(dòng)顯示第7張(圖片1)顯示完成后荣回,將UIScrollView的contentOffset設(shè)置到第2個(gè)imageView上(圖片1)遭贸,這時(shí)候便可繼續(xù)向右滑動(dòng)實(shí)現(xiàn)循環(huán)的效果;同理心软,向左滑動(dòng)時(shí)壕吹,滑動(dòng)到第1張(圖片5)后,將UIScrollView的contentOffset設(shè)置到第6個(gè)imageView上(圖片5)删铃,這樣便可以繼續(xù)向左滑動(dòng)實(shí)現(xiàn)循環(huán)效果耳贬。
性能優(yōu)化:
上面的那種方法,需要我們創(chuàng)建n+2個(gè)imageView,而這些imageView都需要加載到內(nèi)存中去猎唁,所以還有一種簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)咒劲,只需要?jiǎng)?chuàng)建三個(gè)imageView便可以實(shí)現(xiàn)無(wú)限循環(huán)了(事實(shí)上,只需要倆個(gè)imageView便可以實(shí)現(xiàn)诫隅,但是筆者沒(méi)有過(guò)多的去思考腐魂,感興趣的朋友可以自己研究研究)筆者正是基于三個(gè)imageView來(lái)實(shí)現(xiàn)無(wú)限滾動(dòng)視圖的。
實(shí)現(xiàn)原理:
比如有5張圖片逐纬,創(chuàng)建三個(gè)imageView蛔屹,分別展示圖片5,圖片1豁生,圖片2兔毒,默認(rèn)展示第二張(圖片1)漫贞,向右滑動(dòng)顯示第3張(圖片2),顯示完成后育叁,將scrollView的contentOffset重新設(shè)置到中間圖片绕辖,并根據(jù)引用計(jì)數(shù)+1,重新刷新圖片擂红,三個(gè)imageView分別展示為,圖片1围小,圖片2昵骤,圖片3,這時(shí)候就相當(dāng)于圖片2在中間肯适,圖片3在右邊变秦。同理再次向右滑動(dòng),顯示圖片第3張(圖片3)框舔,顯示完成后蹦玫,再將scrollView的contentOffset重新設(shè)置到中間圖片上面,并根據(jù)引用計(jì)數(shù)+1刘绣,重新刷新圖片樱溉,三個(gè)imageView分別展示為圖片2,圖片3纬凤,圖片4福贞,這時(shí)候就相當(dāng)于圖片3在中間,圖片4在右邊停士,依次下去挖帘,便可實(shí)現(xiàn)無(wú)限循環(huán)。
備注:
1.輪播圖加載網(wǎng)絡(luò)圖片時(shí)恋技,筆者利用的是SDWebImage來(lái)實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片的拇舀,如果項(xiàng)目中沒(méi)有SDWebImage,請(qǐng)先導(dǎo)入該框架蜻底,SDWebImage鏈接:https://github.com/rs/SDWebImage
2.筆者這種封裝方法可能并不是最好的骄崩,但是基本功能都可以實(shí)現(xiàn)了,并且調(diào)用簡(jiǎn)單朱躺,可維護(hù)性高刁赖,對(duì)于一些懶人或者新手可以直接拿去使用,如果使用過(guò)程中出現(xiàn)問(wèn)題长搀,或者需要添加需求宇弛,可以聯(lián)系筆者在修改修改。
3.SZKRoundScrollViewDemo(無(wú)限輪播滾動(dòng)圖demo)鏈接:https://github.com/18811314750/SZKRoundScrollView
筆者的其他文章:
iOS開(kāi)發(fā)-輕松學(xué)會(huì)封裝自定義視圖view(自定義彈框封裝詳解)
http://www.reibang.com/p/de2ecfd770c2
iOS開(kāi)發(fā)-一句代碼調(diào)用實(shí)現(xiàn)網(wǎng)絡(luò)的監(jiān)測(cè)功能(基于AFNetworkReachabilityManager的封裝)
http://www.reibang.com/p/b901ad0c1d81
如果有不足或者錯(cuò)誤的地方還望各位讀者批評(píng)指正源请,可以評(píng)論留言枪芒,筆者收到后第一時(shí)間回復(fù)彻况。
QQ/微信:790057066 。
簡(jiǎn)書(shū)號(hào):iOS_凱:http://www.reibang.com/users/86b0ddc92021/latest_articles
GitHub個(gè)人主頁(yè)(歡迎star):https://github.com/18811314750
感謝各位觀眾老爺?shù)拈喿x舅踪,如果覺(jué)得筆者寫(xiě)的還湊合纽甘,可以關(guān)注或收藏一下,不定期分享一些好玩的實(shí)用的demo給大家抽碌。