您的位置:首页 > 运维架构

loopview(死循环实现轮播)

2015-11-05 15:48 477 查看
//
//  WMLoopView.m
//  WMLoopView
//
//  Created by Mark on 15/3/30.
//  Copyright (c) 2015年 yq. All rights reserved.
//

#import "WMLoopView.h"
#define kIdentifier @"WMLoopViewCellIdentifier"
#define kPageH 20
@interface WMLoopView() <UIScrollViewDelegate>
@property (nonatomic, strong) NSMutableArray *currentImages;
@property (nonatomic, assign) int currentPage;
@property (nonatomic, weak) UIPageControl *pageControl;
@property (nonatomic, weak) UIScrollView *scrollView;
@end

@implementation WMLoopView
- (instancetype)initWithFrame:(CGRect)frame images:(NSArray *)images autoPlay:(BOOL)isAuto delay:(NSTimeInterval)timeInterval {
if (self = [super initWithFrame:frame]) {
_autoPlay = isAuto;
_timeInterval = timeInterval;
_images = images;
_currentPage = 0;

[self addScrollView];
[self addPageControl];
if (self.autoPlay == YES) {
[self toPlay];
}
}
return self;
}

#pragma mark - Public Methods
- (void)addPageControl {
CGFloat height = self.frame.size.height;
CGFloat width = self.frame.size.width;
UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(0, height-kPageH, width, kPageH)];
bgView.backgroundColor = [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.2];
UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 0, width, kPageH)];
pageControl.numberOfPages = self.images.count;
pageControl.currentPage = 0;
pageControl.userInteractionEnabled = NO;
_pageControl = pageControl;
[bgView addSubview:self.pageControl];
[self addSubview:bgView];
}

#pragma mark - Private Methods
- (void)toPlay {
[self performSelector:@selector(autoPlayToNextPage) withObject:nil afterDelay:_timeInterval];
}

- (void)autoPlayToNextPage {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(autoPlayToNextPage) object:nil];
[self.scrollView setContentOffset:CGPointMake(self.frame.size.width * 2, 0) animated:YES];
[self performSelector:@selector(autoPlayToNextPage) withObject:nil afterDelay:_timeInterval];
}

- (NSMutableArray *)currentImages {
if (_currentImages == nil) {
_currentImages = [[NSMutableArray alloc] init];
}
[_currentImages removeAllObjects];
NSInteger count = self.images.count;
int i = (int)(_currentPage + count - 1)%count;
[_currentImages addObject:self.images[i]];
[_currentImages addObject:self.images[_currentPage]];
i = (int)(_currentPage + 1)%count;
[_currentImages addObject:self.images[i]];
return _currentImages;
}

- (void)addScrollView {
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
for (int i = 0; i < 3; i++) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * width, 0, width, height)];
imageView.image = [UIImage imageNamed:self.currentImages[i]];
[scrollView addSubview:imageView];
}
scrollView.contentSize = CGSizeMake(3*width, height);
scrollView.contentOffset = CGPointMake(width, 0);
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.delegate = self;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapped:)];
[scrollView addGestureRecognizer:tap];

[self addSubview:scrollView];
_scrollView = scrollView;
}

- (void)refreshImages {
NSArray *subViews = self.scrollView.subviews;
for (int i = 0; i < subViews.count; i++) {
UIImageView *imageView = (UIImageView *)subViews[i];
imageView.image = [UIImage imageNamed:self.currentImages[i]];
}

[self.scrollView setContentOffset:CGPointMake(self.frame.size.width, 0)];
}

#pragma mark - delegate
- (void)singleTapped:(UITapGestureRecognizer *)recognizer {
if ([self.delegate respondsToSelector:@selector(loopViewDidSelectedImage:index:)]) {
[self.delegate loopViewDidSelectedImage:self index:_currentPage];
}
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat x = scrollView.contentOffset.x;
CGFloat width = self.frame.size.width;
if (x >= 2 * width) {
_currentPage = (++_currentPage) % self.images.count;
self.pageControl.currentPage = _currentPage;
[self refreshImages];
}
if (x <= 0) {
_currentPage = (int)(_currentPage + self.images.count - 1)%self.images.count;
self.pageControl.currentPage = _currentPage;
[self refreshImages];
}

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[scrollView setContentOffset:CGPointMake(self.frame.size.width, 0) animated:YES];
}

@end


//
//  WMLoopView.h
//  WMLoopView
//
//  Created by Mark on 15/3/30.
//  Copyright (c) 2015年 yq. All rights reserved.
//

#import <UIKit/UIKit.h>
@class WMLoopView;
@protocol WMLoopViewDelegate <NSObject>
@optional
- (void)loopViewDidSelectedImage:(WMLoopView *)loopView index:(int)index;
@end

@interface WMLoopView : UIView
@property (nonatomic, weak) id<WMLoopViewDelegate> delegate;
@property (nonatomic, assign) BOOL autoPlay;
@property (nonatomic, assign) NSTimeInterval timeInterval;
@property (nonatomic, strong) NSArray *images;

- (instancetype)initWithFrame:(CGRect)frame images:(NSArray *)images autoPlay:(BOOL)isAuto delay:(NSTimeInterval)timeInterval;
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: