iOS -UIScrollView輪播虑绵、焦點(diǎn)圖總結(jié)(三個(gè)imageView-尿瞭、兩個(gè)imageView)

常用實(shí)現(xiàn)輪播圖的方法概述#

1、在scrollView中增加collectionView,利用collectionViewCell的循環(huán)利用機(jī)制和特殊的布局效果實(shí)現(xiàn)
2翅睛、在scrollView中增加三個(gè)ImageView實(shí)現(xiàn)輪播效果
3声搁、在scrollView中增加二個(gè)imageView實(shí)現(xiàn)輪播效果

代碼實(shí)現(xiàn)#

第一種方式:核心代碼

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:    (NSInteger)section
   {
      return self.foucsArray.count   *LZBFoucsTimes; 
   }
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
  {
     LZBCollectionFoucsCell *cell =  [LZBCollectionFoucsCell CollectionFoucsCell:collectionView WithReuseIdentifier:LZBFoucsCollectionCellID forIndexPath:indexPath];
     NSInteger length = self.foucsArray.count;
     cell.cellImageName =self.foucsArray[indexPath.row%length];
     return cell;
   }

第二種方式是三個(gè)ImageView實(shí)現(xiàn)

// 更新imageView上面的圖片內(nèi)容
for (NSInteger i = 0; i < LZBAllImageViewCount; i++) { // i是用來獲取imageView的
    UIImageView *imageView = self.scrollView.subviews[i];
    // 根據(jù)當(dāng)前頁碼求出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ù)
    [self loadImage:imageIndex withImageView:imageView];
    }

滾動(dòng)時(shí)候計(jì)算當(dāng)前索引核心代碼

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

同時(shí)可以直接從github下載捕发,readme上面有詳細(xì)的方法介紹:三個(gè)imageView實(shí)現(xiàn)scrollView輪播圖

第三種方式:之前看到別人有兩個(gè)ImageView實(shí)現(xiàn)輪播圖疏旨,看了之后感覺做得還不做就是動(dòng)畫效果少了一些,所以我就下載了代碼進(jìn)行了改進(jìn)爬骤,下面是核心代碼:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetX = scrollView.contentOffset.x;
[self computeCurrentPageWithOffset:offsetX];
//加載ImageView
if(offsetX < scrollView_Width * 2)   //左滾動(dòng)
{
    switch (self.style) {
        case LZBFocusScrollViewScrollStyle_Fade:
            {
                self.currentImageView.alpha = offsetX/scrollView_Width -1;
                self.otherImageView.alpha = 2 - offsetX/scrollView_Width;
            }
            break; 
        default:
            {
              self.otherImageView.frame = CGRectMake(scrollView_Width, 0, scrollView_Width, scrollView_Height);
            }
            break;
    }
    self.nextIndex = self.currentIndex -1;
    if(self.nextIndex < 0)
        self.nextIndex = self.images.count -1;
    if(offsetX <= scrollView_Width)
        [self changeToNextImage];
   }
else  if (offsetX >scrollView_Width * 2)   //右邊滑動(dòng)
{ 
    switch (self.style) {
        case LZBFocusScrollViewScrollStyle_Fade:
            {
                self.currentImageView.alpha = offsetX/scrollView_Width -2;
                self.otherImageView.alpha = 3 - offsetX/scrollView_Width;
            }
            break;
        default:
            {
            }
            break;
    }
    self.otherImageView.frame = CGRectMake(CGRectGetMaxX(self.currentImageView.frame), 0, scrollView_Width, scrollView_Height);
    self.nextIndex = (self.currentIndex + 1)%self.images.count;
    if (offsetX >=scrollView_Width * 3 ) {
        [self changeToNextImage];
    }  
}
if(self.imageUrls.count > 0)
{
    [self.otherImageView sd_setImageWithURL:[NSURL URLWithString:self.imageUrls[self.nextIndex] ]placeholderImage:self.placeHoderImage];
}
 else
 {
   self.otherImageView.image = self.images[self.nextIndex];
 }    
}

同時(shí)可以直接下載github代碼使用原文兩個(gè)imageView實(shí)現(xiàn)輪播圖和我的改動(dòng)加強(qiáng)版 兩個(gè)imageView實(shí)現(xiàn)輪播圖加強(qiáng)版

原理簡(jiǎn)介#

第一種方法:采用UICollectionViewLayout流水布局樣式布局collectionViewCell,利用collectionViewCell的循環(huán)利用機(jī)制利用可重用的cell賦予不同的值(優(yōu)點(diǎn):操作簡(jiǎn)單充石,缺點(diǎn):代碼太多)

第二種方法:從當(dāng)前的imageView滾動(dòng)到下一個(gè)imageView,然后把下一個(gè)imageView滾動(dòng)到三個(gè)imageView的中心位置霞玄,在這過程中賦值的時(shí)候是三個(gè)imageView同時(shí)賦值骤铃,滾動(dòng)的時(shí)候找到距離滾動(dòng)最近的一個(gè)imageView currentDelta = ABS(imageView.frame.origin.x - self.scrollView.contentOffset.x); 把這個(gè)imageView的索引設(shè)置為當(dāng)前的索引,滾動(dòng)完成后把這個(gè)imageView設(shè)置為中心滾動(dòng)位置坷剧。

第三種方法:設(shè)置scrollViewContentSize的滾動(dòng)范圍是5 * scrollView_Width并且把currentImageView增加到scrollView中惰爬,并且設(shè)置currentImageView的offset.x = scrollView_Width(相當(dāng)于是把currentImageView放在中間位置),讓后通過- (void)scrollViewDidScroll:(UIScrollView *)的scrollView.contentOffset.x判斷滾動(dòng)方向 scrollView.contentOffset.x < scrollView_Width * 2 左邊滾動(dòng) otherImageView增加在右邊 scrollView.contentOffset.x > scrollView_Width * 2 右邊滾動(dòng) otherImageView增加在左邊 滾動(dòng)otherImageView之后惫企,賦值并且設(shè)置 self.currentImageView.image = self.otherImageView.image;撕瞧,在把currentView放在中間 self.scrollView.contentOffset = CGPointMake(scrollView_Width * 2, 0);

代碼下載鏈接:
三個(gè)imageView實(shí)現(xiàn):三個(gè)imageView實(shí)現(xiàn)scrollView輪播圖
兩個(gè)imageView實(shí)現(xiàn)(原文版):兩個(gè)imageView實(shí)現(xiàn)輪播圖
兩個(gè)imageView實(shí)現(xiàn)各種動(dòng)畫(加強(qiáng)版):[兩個(gè)imageView實(shí)現(xiàn)輪播圖] 兩個(gè)imageView實(shí)現(xiàn)輪播圖加強(qiáng)版

最后贈(zèng)言###

如果覺得文章對(duì)您有幫助陵叽,不要忘記star哦!??,star 是對(duì)程序猿最大的鼓勵(lì)丛版!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巩掺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子页畦,更是在濱河造成了極大的恐慌胖替,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豫缨,死亡現(xiàn)場(chǎng)離奇詭異独令,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)好芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門燃箭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舍败,你說我怎么就攤上這事招狸。” “怎么了瓤湘?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵瓢颅,是天一觀的道長恩尾。 經(jīng)常有香客問我弛说,道長,這世上最難降的妖魔是什么翰意? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任木人,我火速辦了婚禮,結(jié)果婚禮上冀偶,老公的妹妹穿的比我還像新娘醒第。我一直安慰自己,他們只是感情好进鸠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布稠曼。 她就那樣靜靜地躺著,像睡著了一般客年。 火紅的嫁衣襯著肌膚如雪霞幅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天量瓜,我揣著相機(jī)與錄音司恳,去河邊找鬼。 笑死绍傲,一個(gè)胖子當(dāng)著我的面吹牛扔傅,可吹牛的內(nèi)容都是我干的耍共。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼猎塞,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼试读!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荠耽,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤鹏往,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后骇塘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊履,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年款违,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唐瀑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡插爹,死狀恐怖哄辣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赠尾,我是刑警寧澤力穗,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站气嫁,受9級(jí)特大地震影響当窗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寸宵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一崖面、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梯影,春花似錦巫员、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至感猛,卻和暖如春七扰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唱遭。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工戳寸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拷泽。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓疫鹊,卻偏偏與公主長得像袖瞻,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拆吆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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