圖片輪播器(使用一個(gè)UIImageView實(shí)現(xiàn)輪播器的功能)

在iOS開發(fā)中缸托,實(shí)現(xiàn)一個(gè)圖片輪播器的方法有好多種吟秩,比如使用UIScrollView、UICollectionView或者利用三個(gè)UIImageView,以前三種方法都能實(shí)現(xiàn)一個(gè)圖片輪播器的功能举畸,這里使用的是利用一個(gè)UIImageView來實(shí)現(xiàn)。

首先凳枝,新建一個(gè)InfinitudeView抄沮,在.m文件中看下需要設(shè)置的屬性

@interface InfinitudeView ()

@property (nonatomic, weak) UIImageView *imgView; /**< 圖片容器 */
@property (nonatomic, assign) NSInteger index; /**< 圖片索引 */
@property (nonatomic, assign) NSInteger imageCount; /**< 圖片數(shù)量 */
@property (nonatomic, strong) NSTimer *timer; /**< 定時(shí)器 */
@property (nonatomic, weak) UILabel *showCountLabel; /**< 顯示索引 */

@property (nonatomic, strong) UISwipeGestureRecognizer *leftSwipeGesture; /**< 左滑手勢(shì) */
@property (nonatomic, strong) UISwipeGestureRecognizer *rightSwipeGesture; /**< 右滑手勢(shì) */

@end

1.顯示圖片和圖片的索引

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:self.bounds];
    imgView.contentMode = UIViewContentModeScaleAspectFit;
    [self addSubview:imgView];
    self.imgView = imgView;

    UILabel *showCountLabel = [[UILabel alloc] init];
    [self addSubview:showCountLabel];
    self.showCountLabel = showCountLabel;
    showCountLabel.translatesAutoresizingMaskIntoConstraints = NO;
    showCountLabel.font = [UIFont systemFontOfSize:15.0f];
    [self addConstraints:@[
                           [NSLayoutConstraint constraintWithItem:showCountLabel attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0f constant:-20],
                           [NSLayoutConstraint constraintWithItem:showCountLabel attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-20]]
                          ];

2.在.h文件中添加一個(gè)圖片數(shù)組,用于數(shù)據(jù)傳遞進(jìn)來

@interface InfinitudeView : UIView

@property (nonatomic, strong) NSArray *imageArray; /**< 圖片數(shù)組 */

@end

3.重寫imageArray的setter方法岖瑰,當(dāng)傳入圖片的時(shí)候叛买,設(shè)置好

/**
 *  根據(jù)圖片數(shù)組設(shè)置圖片
 *
 *  @param imageArray 圖片數(shù)組
 */
- (void)setImageArray:(NSArray *)imageArray {
    
    _imageArray = imageArray;
    _imageCount = imageArray.count;
    _index = 0;
    [self setImage];
}

4.數(shù)組可以傳入圖片或者圖片的鏈接字符串,因此需要做一下判斷蹋订,加載網(wǎng)絡(luò)圖片為了簡單一些率挣,直接使用的第三方SDWebImage

/**
 *  設(shè)置圖片
 */
- (void)setImage {
    
    // 顯示圖片索引
    [self setShowCountLabelText];
    id object = [_imageArray firstObject];
    // 如果傳入的是圖片則直接顯示圖片,如果是圖片鏈接露戒,網(wǎng)絡(luò)加載
    if ([object isKindOfClass:[UIImage class]]) {
        _imgView.image = _imageArray[_index];
    } else if ([object isKindOfClass:[NSMutableString class]]) {
        [_imgView sd_setImageWithURL:[NSURL URLWithString:_imageArray[_index]]];
    }
}

5.索引的設(shè)置

/**
 *  顯示索引
 */
- (void)setShowCountLabelText {
    
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
    NSAttributedString *str1 = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%zd", _index + 1] attributes:@{NSForegroundColorAttributeName : [UIColor colorWithRed:0.915 green:0.685 blue:0.574 alpha:1.000]}];
    NSAttributedString *str2 = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"/%zd", _imageCount] attributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];
    [attributedString appendAttributedString:str1];
    [attributedString appendAttributedString:str2];
    _showCountLabel.attributedText = attributedString;
}

到目前為止椒功,運(yùn)行效果

1.png

6.添加手勢(shì)

/**
 *  添加手勢(shì)
 */
- (void)addGuesture {
    
    // 1.添加左滑動(dòng)手勢(shì)
    _leftSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(gestureMethod:)];
    _leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;
    [self addGestureRecognizer:_leftSwipeGesture];
    
    // 2.添加右滑動(dòng)手勢(shì)
    _rightSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(gestureMethod:)];
    _rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self addGestureRecognizer:_rightSwipeGesture];
}

7.手持的響應(yīng)方法

/**
 *  手勢(shì)響應(yīng)方法
 *
 *  @param swipeGesture 響應(yīng)的手勢(shì)
 */
- (void)gestureMethod:(UISwipeGestureRecognizer *)swipeGesture {
    
    switch (swipeGesture.direction) {
        case UISwipeGestureRecognizerDirectionLeft:
            _index++;
            [self setImageWithIndex:_index];
            [self animationTransitionWithSwipeGestureRecognizerDirection:swipeGesture.direction];
            break;
        case UISwipeGestureRecognizerDirectionRight:
            _index--;
            [self setImageWithIndex:_index];
            [self animationTransitionWithSwipeGestureRecognizerDirection:swipeGesture.direction];
            break;
        default:break;
    }
}

8.根據(jù)滑動(dòng)設(shè)置圖片

/**
 *  根據(jù)手勢(shì)設(shè)置圖片
 */
- (void)setImageWithIndex:(NSInteger)index {
    
    if (index > _imageCount - 1) {
        _index = 0;
    } else if (index < 0) {
        _index = _imageCount - 1;
    }
    
    [self setImage];
}

9.設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫

/**
 *  添加轉(zhuǎn)場(chǎng)動(dòng)畫
 *
 *  @param direction 手勢(shì)方向
 */
- (void)animationTransitionWithSwipeGestureRecognizerDirection:(UISwipeGestureRecognizerDirection)direction {
    
    CATransition *transition = [CATransition animation];
    transition.duration = 0.5f;
    // 設(shè)置動(dòng)畫的樣式
    transition.type = kCATransitionPush;
    if (direction == UISwipeGestureRecognizerDirectionRight) {
        transition.subtype = @"fromLeft";
    } else {
        transition.subtype = @"fromRight";
    }
    [_imgView.layer addAnimation:transition forKey:nil];
}

運(yùn)行

2.gif

9.接下來是添加一個(gè)定時(shí)器,在傳入圖片的時(shí)候添加

/**
 *  根據(jù)圖片數(shù)組設(shè)置圖片
 *
 *  @param imageArray 圖片數(shù)組
 */
- (void)setImageArray:(NSArray *)imageArray {
    
    _imageArray = imageArray;
    _imageCount = imageArray.count;
    _index = 0;
    _timer = [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
    [self setImage];
}

/**
 *  定時(shí)器響應(yīng)方法
 */
- (void)timerMethod {

    _index++;
    [self setImageWithIndex:_index];
    [self animationTransitionWithSwipeGestureRecognizerDirection:_leftSwipeGesture.direction];
}

當(dāng)滑動(dòng)的時(shí)候智什,定時(shí)器需要關(guān)閉

/**
 *  手勢(shì)響應(yīng)方法
 *
 *  @param swipeGesture 響應(yīng)的手勢(shì)
 */
- (void)gestureMethod:(UISwipeGestureRecognizer *)swipeGesture {
    
    [_timer invalidate];
    switch (swipeGesture.direction) {
        case UISwipeGestureRecognizerDirectionLeft:
            _index++;
            [self setImageWithIndex:_index];
            [self animationTransitionWithSwipeGestureRecognizerDirection:swipeGesture.direction];
            break;
        case UISwipeGestureRecognizerDirectionRight:
            _index--;
            [self setImageWithIndex:_index];
            [self animationTransitionWithSwipeGestureRecognizerDirection:swipeGesture.direction];
            break;
        default:break;
    }
    _timer = [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
}

再看看整體效果

3.gif

整體代碼
https://github.com/JudeGGT/-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末动漾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荠锭,更是在濱河造成了極大的恐慌旱眯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件证九,死亡現(xiàn)場(chǎng)離奇詭異删豺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愧怜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門呀页,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叫搁,你說我怎么就攤上這事赔桌。” “怎么了渴逻?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵疾党,是天一觀的道長。 經(jīng)常有香客問我惨奕,道長雪位,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任梨撞,我火速辦了婚禮雹洗,結(jié)果婚禮上香罐,老公的妹妹穿的比我還像新娘。我一直安慰自己时肿,他們只是感情好庇茫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螃成,像睡著了一般旦签。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸宏,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天宁炫,我揣著相機(jī)與錄音,去河邊找鬼氮凝。 笑死羔巢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罩阵。 我是一名探鬼主播竿秆,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼永脓!你這毒婦竟也來了袍辞?” 一聲冷哼從身側(cè)響起鞋仍,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤常摧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后威创,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落午,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年肚豺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溃斋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吸申,死狀恐怖梗劫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情截碴,我是刑警寧澤梳侨,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站日丹,受9級(jí)特大地震影響走哺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哲虾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一丙躏、第九天 我趴在偏房一處隱蔽的房頂上張望择示。 院中可真熱鬧,春花似錦晒旅、人聲如沸栅盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剪菱。三九已至,卻和暖如春拴签,著一層夾襖步出監(jiān)牢的瞬間孝常,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工蚓哩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留构灸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓岸梨,卻偏偏與公主長得像喜颁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹阔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫半开、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評(píng)論 25 707
  • 文章首發(fā)于原創(chuàng)公眾號(hào):畢業(yè)不等于失業(yè) id:bybdysy 一 經(jīng)常有朋友私信我: 我應(yīng)該去做兼職嗎赃份? 我應(yīng)該去考...
    86e280374491閱讀 336評(píng)論 1 0
  • 覺察日記20170406+何娜+3w4 自導(dǎo)自演 “伊能靜47歲拼命生下一個(gè)女兒寂拆,大家都以為是嫁給愛情的,看到文章...
    Bemy閱讀 299評(píng)論 2 3