自制的一款無(wú)限輪播器

對(duì)于圖片的無(wú)限滾動(dòng)播放想必大家應(yīng)該可以找到很多輪子或者自己也能寫出一個(gè)霞丧,那么為什么我還要在這里寫呢目锭,其實(shí)也沒(méi)啥可以指出的要點(diǎn)厌秒,只是個(gè)人每天想寫點(diǎn)東西罷了荧呐,低調(diào)路過(guò)汉形。

實(shí)現(xiàn)無(wú)限滾動(dòng)的思路我個(gè)人認(rèn)為主要有兩種,一種是采用UICollectionView給定一定數(shù)量的Item倍阐,然后當(dāng)用戶不斷的滾動(dòng)的時(shí)候有足夠空間展示圖片概疆,當(dāng)用戶停止?jié)L動(dòng)了就馬上返回之前的中點(diǎn),這樣相當(dāng)于有重置了Item的下標(biāo)峰搪,造成無(wú)限滾動(dòng)的效果岔冀。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSInteger index = scrollView.contentOffset.x / scrollView.frame.size.width;
    // 設(shè)置的Item個(gè)數(shù) 加上 需要展示的圖片數(shù) 等于距離中心點(diǎn)偏離的個(gè)數(shù)
    NSInteger item = (ItemCount / 2) + (index % 5);
    
    // 回滾到初始的中點(diǎn)位置
    [((UICollectionView *)scrollView) scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:item inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
}

另外一種是利用UIScrollView來(lái)實(shí)現(xiàn),在ScrollView添加內(nèi)容視圖控件概耻,有人用兩個(gè)使套,也有人用三個(gè)。這種方法核心就是判斷用戶滾動(dòng)的方向鞠柄,然后迅速的把移除屏幕的視圖擺放到準(zhǔn)備顯示的那邊屏幕侦高。本人這個(gè)項(xiàng)目是采用添加三個(gè)內(nèi)容視圖,另外本項(xiàng)目自帶了SDWebImage春锋,實(shí)現(xiàn)自動(dòng)加載網(wǎng)絡(luò)的圖片矫膨,如果你的項(xiàng)目有這個(gè)三方的話差凹,可以自行刪除期奔,GitHub,網(wǎng)絡(luò)原因還在上傳,如果看到代碼危尿,請(qǐng)自行忽略呐萌。

Cyclic.gif

其核心代碼如下:

#pragma mark - <UIScrollViewDelegate>
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 找出顯示在最中間的imageView
    UIImageView *middleImageView = nil;
    // x值和偏移量x的最小差值
    CGFloat minDelta = MAXFLOAT;
    for (NSInteger i = 0; i < LXImageViewCount; i++) {
        UIImageView *imageView = self.scrollView.subviews[i];
        
        // x值和偏移量x差值最小的imageView,就是顯示在最中間的imageView
        CGFloat currentDelta = 0;
        if (self.scrollDirection == LXCyclicScrollDirectionHorizontal) {
            currentDelta = ABS(imageView.frame.origin.x - self.scrollView.contentOffset.x);
        } else {
            currentDelta = ABS(imageView.frame.origin.y - self.scrollView.contentOffset.y);
        }
        if (currentDelta < minDelta) {
            minDelta = currentDelta;
            middleImageView = imageView;
        }
    }
    
    self.pageControl.currentPage = middleImageView.tag;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // 更新圖片內(nèi)容和scrollView的偏移量
    [self updateContentAndOffset];
}

/**
 *  更新圖片內(nèi)容和scrollView的偏移量
 */
- (void)updateContentAndOffset
{
    // 1.更新imageView上面的圖片內(nèi)容
    for (NSInteger i = 0; i < LXImageViewCount; i++) { // i是用來(lái)獲取imageView的
        UIImageView *imageView = self.scrollView.subviews[i];
        
        // 根據(jù)當(dāng)前頁(yè)碼求出imageIndex
        NSInteger imageIndex = 0;
        if (i == 0) { // 左邊
            imageIndex = self.pageControl.currentPage - 1;
            if (imageIndex == -1) { // 顯示最后面一張
                imageIndex = self.images.count - 1;
            }
        } else if (i == 1) { // 中間
            imageIndex = self.pageControl.currentPage;
        } else if (i == 2) { // 右邊
            imageIndex = self.pageControl.currentPage + 1;
            if (imageIndex == self.images.count) { // 顯示最前面一張
                imageIndex = 0;
            }
        }
        
        imageView.tag = imageIndex;
        // 圖片數(shù)據(jù) 考慮到無(wú)論傳遞什么參數(shù)都能加載到圖片
        id obj = self.images[imageIndex];
        if ([obj isKindOfClass:[UIImage class]]) { // UIImage對(duì)象
            imageView.image = obj;
        } else if ([obj isKindOfClass:[NSString class]]) { // 本地圖片名
            imageView.image = [UIImage imageNamed:obj];
        } else if ([obj isKindOfClass:[NSURL class]]) { // 遠(yuǎn)程圖片URL
            [imageView sd_setImageWithURL:obj placeholderImage:self.placeholder];
        }
    }
    
    // 2.設(shè)置scrollView.contentOffset.x = 1倍寬度
    if (self.scrollDirection == LXCyclicScrollDirectionHorizontal) {
        self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width, 0);
    } else {
        self.scrollView.contentOffset = CGPointMake(0, self.scrollView.frame.size.height);
    }
}

再來(lái)看看頭文件谊娇,我提供了一下這些參數(shù)可以調(diào)整滾動(dòng)器

@class LXCyclicScrollView;

@protocol LXCyclicScrollViewDelegate <NSObject>
@optional
- (void)cyclicScrollView:(LXCyclicScrollView *)cisylicScrollView didClickImageAtIndex:(NSInteger)index;
@end

typedef NS_ENUM(NSInteger, LXCyclicScrollDirection) {
    /** 左右滑動(dòng) */
    LXCyclicScrollDirectionHorizontal = 0,
    /** 上下滑動(dòng) */
    LXCyclicScrollDirectionVertical
};

@interface LXCyclicScrollView : UIView
/** 圖片數(shù)據(jù)(里面可以存放UIImage對(duì)象肺孤、NSString對(duì)象【本地圖片名】、NSURL對(duì)象【遠(yuǎn)程圖片的URL】) */
@property (nonatomic, strong) NSArray *images;
/** 占位圖片 */
@property (nonatomic, strong) UIImage *placeholder;
/** 每張圖片之間的時(shí)間間隔 */
@property (nonatomic, assign) NSTimeInterval interval;
/** 可以修改頁(yè)碼控制器的顏色等 */
@property (nonatomic, weak, readonly) UIPageControl *pageControl;
/** 圖片滾動(dòng)的方向 */
@property (nonatomic, assign) LXCyclicScrollDirection scrollDirection;

/** 代理 */
@property (nonatomic, weak) id<LXCyclicScrollViewDelegate> delegate;
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赠堵,隨后出現(xiàn)的幾起案子小渊,更是在濱河造成了極大的恐慌,老刑警劉巖茫叭,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酬屉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡揍愁,警方通過(guò)查閱死者的電腦和手機(jī)呐萨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)莽囤,“玉大人谬擦,你說(shuō)我怎么就攤上這事⌒喽校” “怎么了惨远?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饵沧。 經(jīng)常有香客問(wèn)我锨络,道長(zhǎng),這世上最難降的妖魔是什么狼牺? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任羡儿,我火速辦了婚禮,結(jié)果婚禮上是钥,老公的妹妹穿的比我還像新娘掠归。我一直安慰自己,他們只是感情好悄泥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布虏冻。 她就那樣靜靜地躺著,像睡著了一般弹囚。 火紅的嫁衣襯著肌膚如雪厨相。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天鸥鹉,我揣著相機(jī)與錄音蛮穿,去河邊找鬼。 笑死毁渗,一個(gè)胖子當(dāng)著我的面吹牛践磅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灸异,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼府适,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羔飞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起檐春,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逻淌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疟暖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恍风,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年誓篱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朋贬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窜骄,死狀恐怖锦募,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邻遏,我是刑警寧澤糠亩,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站准验,受9級(jí)特大地震影響赎线,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糊饱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一垂寥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧另锋,春花似錦滞项、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至室梅,卻和暖如春戏仓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亡鼠。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赏殃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拆宛。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓嗓奢,卻偏偏與公主長(zhǎng)得像讼撒,于是被迫代替她去往敵國(guó)和親浑厚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子股耽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,791評(píng)論 22 665
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件钳幅、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,120評(píng)論 4 61
  • 男生經(jīng)常會(huì)覺(jué)得不知道怎么哄情緒化的女生物蝙,特別在女生心情不好時(shí),其實(shí)男生要做的很簡(jiǎn)單敢艰,就是擁抱诬乞。也許女生剛開始的時(shí)候...
    米小慧閱讀 2,658評(píng)論 0 2
  • spring mvc 工作機(jī)制(原理): DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制...
    java大濕兄閱讀 1,898評(píng)論 5 24