今天做小区宝时,用到一个第三方ImagePlayerView用来做图片轮播,用着感觉非常爽, 这里就记录一下,感谢作者。
// // ImagePlayerView.h // ImagePlayerView // // Created by 陈颜俊 on 14-6-5. // Copyright (c) 2014年 Chenyanjun. All rights reserved. // #import <UIKit/UIKit.h> typedef NS_ENUM(NSInteger, ICPageControlPosition) { ICPageControlPosition_TopLeft, ICPageControlPosition_TopCenter, ICPageControlPosition_TopRight, ICPageControlPosition_BottomLeft, ICPageControlPosition_BottomCenter, ICPageControlPosition_BottomRight }; @protocol ImagePlayerViewDelegate; @interface ImagePlayerView : UIView @property (nonatomic, assign) id<ImagePlayerViewDelegate> imagePlayerViewDelegate; @property (nonatomic, assign) BOOL autoScroll; // default is YES, set NO to turn off autoScroll @property (nonatomic, assign) NSUInteger scrollInterval; // scroll interval, unit: second, default is 2 seconds @property (nonatomic, assign) ICPageControlPosition pageControlPosition; // pageControl position, defautl is bottomright @property (nonatomic, assign) BOOL hidePageControl; // hide pageControl, default is NO /** * Init image player * * @param imageURLs NSURL array, image path * @param placeholder placeholder image * @param delegate delegate * @deprecated use - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate instead */ - (void)initWithImageURLs:(NSArray *)imageURLs placeholder:(UIImage *)placeholder delegate:(id<ImagePlayerViewDelegate>)delegate DEPRECATED_ATTRIBUTE; /** * Init image player * * @param imageURLs NSURL array, image path * @param placeholder placeholder image * @param delegate delegate * @param edgeInsets scroll view edgeInsets * @deprecated use - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets instead */ - (void)initWithImageURLs:(NSArray *)imageURLs placeholder:(UIImage *)placeholder delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets DEPRECATED_ATTRIBUTE; /** * Init image player * * @param count * @param delegate */ - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate; /** * Init image player * * @param count * @param delegate * @param edgeInsets scroll view edgeInsets */ - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets; @end @protocol ImagePlayerViewDelegate <NSObject> @required /** * Init imageview * * @param imagePlayerView ImagePlayerView object * @param imageView UIImageView object * @param index index of imageview */ - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView loadImageForImageView:(UIImageView *)imageView index:(NSInteger)index; @optional /** * Tap ImageView action * * @param imagePlayerView ImagePlayerView object * @param index index of imageview * @param imageURL image url * @deprecated use - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView didTapAtIndex:(NSInteger)index instead */ - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView didTapAtIndex:(NSInteger)index imageURL:(NSURL *)imageURL DEPRECATED_ATTRIBUTE; /** * Tap ImageView action * * @param imagePlayerView ImagePlayerView object * @param index index of imageview */ - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView didTapAtIndex:(NSInteger)index; @end
// // ImagePlayerView.m // ImagePlayerView // // Created by 陈颜俊 on 14-6-5. // Copyright (c) 2014年 Chenyanjun. All rights reserved. // #import "ImagePlayerView.h" #define kStartTag 1000 #define kDefaultScrollInterval 2 @interface ImagePlayerView() <UIScrollViewDelegate> @property (nonatomic, strong) UIScrollView *scrollView; //@property (nonatomic, strong) NSArray *imageURLs; @property (nonatomic, assign) NSInteger count; @property (nonatomic, strong) NSTimer *autoScrollTimer; @property (nonatomic, strong) UIPageControl *pageControl; @property (nonatomic, strong) NSMutableArray *pageControlConstraints; @end @implementation ImagePlayerView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self _init]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self _init]; } return self; } - (id)init { self = [super init]; if (self) { [self _init]; } return self; } - (void)_init { self.scrollInterval = kDefaultScrollInterval; // scrollview self.scrollView = [[UIScrollView alloc] init]; [self addSubview:self.scrollView]; self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; self.scrollView.pagingEnabled = YES; self.scrollView.bounces = NO; self.scrollView.showsHorizontalScrollIndicator = NO; self.scrollView.showsVerticalScrollIndicator = NO; self.scrollView.directionalLockEnabled = YES; self.scrollView.delegate = self; // UIPageControl self.pageControl = [[UIPageControl alloc] init]; self.pageControl.translatesAutoresizingMaskIntoConstraints = NO; self.pageControl.numberOfPages = self.count; self.pageControl.currentPage = 0; [self addSubview:self.pageControl]; NSArray *pageControlVConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[pageControl]-0-|" options:kNilOptions metrics:nil views:@{@"pageControl": self.pageControl}]; NSArray *pageControlHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[pageControl]-|" options:kNilOptions metrics:nil views:@{@"pageControl": self.pageControl}]; self.pageControlConstraints = [NSMutableArray arrayWithArray:pageControlVConstraints]; [self.pageControlConstraints addObjectsFromArray:pageControlHConstraints]; [self addConstraints:self.pageControlConstraints]; } // @deprecated use - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate instead - (void)initWithImageURLs:(NSArray *)imageURLs placeholder:(UIImage *)placeholder delegate:(id<ImagePlayerViewDelegate>)delegate { [self initWithCount:imageURLs.count delegate:delegate edgeInsets:UIEdgeInsetsZero]; } // @deprecated use - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets instead - (void)initWithImageURLs:(NSArray *)imageURLs placeholder:(UIImage *)placeholder delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets { [self initWithCount:imageURLs.count delegate:delegate edgeInsets:edgeInsets]; } - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate { [self initWithCount:count delegate:delegate edgeInsets:UIEdgeInsetsZero]; } - (void)initWithCount:(NSInteger)count delegate:(id<ImagePlayerViewDelegate>)delegate edgeInsets:(UIEdgeInsets)edgeInsets { self.count = count; self.imagePlayerViewDelegate = delegate; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:|-%d-[scrollView]-%d-|", (int)edgeInsets.top, (int)edgeInsets.bottom] options:kNilOptions metrics:nil views:@{@"scrollView": self.scrollView}]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"H:|-%d-[scrollView]-%d-|", (int)edgeInsets.left, (int)edgeInsets.right] options:kNilOptions metrics:nil views:@{@"scrollView": self.scrollView}]]; if (count == 0) { return; } self.pageControl.numberOfPages = count; self.pageControl.currentPage = 0; CGFloat startX = self.scrollView.bounds.origin.x; CGFloat width = self.bounds.size.width - edgeInsets.left - edgeInsets.right; CGFloat height = self.bounds.size.height - edgeInsets.top - edgeInsets.bottom; for (int i = 0; i < count; i++) { startX = i * width; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(startX, 0, width, height)]; imageView.contentMode = UIViewContentModeScaleToFill; imageView.tag = kStartTag + i; imageView.userInteractionEnabled = YES; imageView.translatesAutoresizingMaskIntoConstraints = NO; [imageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]]; [imageView addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:width]]; [imageView addConstraint:[NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:height]]; [self.imagePlayerViewDelegate imagePlayerView:self loadImageForImageView:imageView index:i]; [self.scrollView addSubview:imageView]; } // constraint NSMutableDictionary *viewsDictionary = [NSMutableDictionary dictionary]; NSMutableArray *imageViewNames = [NSMutableArray array]; for (int i = kStartTag; i < kStartTag + count; i++) { NSString *imageViewName = [NSString stringWithFormat:@"imageView%d", i - kStartTag]; [imageViewNames addObject:imageViewName]; UIImageView *imageView = (UIImageView *)[self.scrollView viewWithTag:i]; [viewsDictionary setObject:imageView forKey:imageViewName]; } [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:|-0-[%@]-0-|", [imageViewNames objectAtIndex:0]] options:kNilOptions metrics:nil views:viewsDictionary]]; NSMutableString *hConstraintString = [NSMutableString string]; [hConstraintString appendString:@"H:|-0"]; for (NSString *imageViewName in imageViewNames) { [hConstraintString appendFormat:@"-[%@]-0", imageViewName]; } [hConstraintString appendString:@"-|"]; [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:hConstraintString options:NSLayoutFormatAlignAllTop metrics:nil views:viewsDictionary]]; self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * count, self.scrollView.frame.size.height); self.scrollView.contentInset = UIEdgeInsetsZero; } - (void)handleTapGesture:(UIGestureRecognizer *)tapGesture { UIImageView *imageView = (UIImageView *)tapGesture.view; NSInteger index = imageView.tag - kStartTag; if (self.imagePlayerViewDelegate && [self.imagePlayerViewDelegate respondsToSelector:@selector(imagePlayerView:didTapAtIndex:)]) { [self.imagePlayerViewDelegate imagePlayerView:self didTapAtIndex:index]; } } #pragma mark - auto scroll - (void)setAutoScroll:(BOOL)autoScroll { _autoScroll = autoScroll; if (autoScroll) { if (!self.autoScrollTimer || !self.autoScrollTimer.isValid) { self.autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:self.scrollInterval target:self selector:@selector(handleScrollTimer:) userInfo:nil repeats:YES]; } } else { if (self.autoScrollTimer && self.autoScrollTimer.isValid) { [self.autoScrollTimer invalidate]; self.autoScrollTimer = nil; } } } - (void)setScrollInterval:(NSUInteger)scrollInterval { _scrollInterval = scrollInterval; if (self.autoScrollTimer && self.autoScrollTimer.isValid) { [self.autoScrollTimer invalidate]; self.autoScrollTimer = nil; } self.autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:self.scrollInterval target:self selector:@selector(handleScrollTimer:) userInfo:nil repeats:YES]; } - (void)handleScrollTimer:(NSTimer *)timer { if (self.count == 0) { return; } NSInteger currentPage = self.pageControl.currentPage; NSInteger nextPage = currentPage + 1; if (nextPage == self.count) { nextPage = 0; } BOOL animated = YES; if (nextPage == 0) { animated = NO; } UIImageView *imageView = (UIImageView *)[self.scrollView viewWithTag:(nextPage + kStartTag)]; [self.scrollView scrollRectToVisible:imageView.frame animated:animated]; self.pageControl.currentPage = nextPage; } #pragma mark - scroll delegate -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ // disable v direction scroll if (scrollView.contentOffset.y > 0) { [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)]; } } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // when user scrolls manually, stop timer and start timer again to avoid next scroll immediatelly if (self.autoScrollTimer && self.autoScrollTimer.isValid) { [self.autoScrollTimer invalidate]; } self.autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:self.scrollInterval target:self selector:@selector(handleScrollTimer:) userInfo:nil repeats:YES]; // update UIPageControl CGRect visiableRect = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, scrollView.bounds.size.width, scrollView.bounds.size.height); NSInteger currentIndex = 0; for (UIImageView *imageView in scrollView.subviews) { if ([imageView isKindOfClass:[UIImageView class]]) { if (CGRectContainsRect(visiableRect, imageView.frame)) { currentIndex = imageView.tag - kStartTag; break; } } } self.pageControl.currentPage = currentIndex; } #pragma mark - - (void)setPageControlPosition:(ICPageControlPosition)pageControlPosition { NSString *vFormat = nil; NSString *hFormat = nil; switch (pageControlPosition) { case ICPageControlPosition_TopLeft: { vFormat = @"V:|-0-[pageControl]"; hFormat = @"H:|-[pageControl]"; break; } case ICPageControlPosition_TopCenter: { vFormat = @"V:|-0-[pageControl]"; hFormat = @"H:|[pageControl]|"; break; } case ICPageControlPosition_TopRight: { vFormat = @"V:|-0-[pageControl]"; hFormat = @"H:[pageControl]-|"; break; } case ICPageControlPosition_BottomLeft: { vFormat = @"V:[pageControl]-0-|"; hFormat = @"H:|-[pageControl]"; break; } case ICPageControlPosition_BottomCenter: { vFormat = @"V:[pageControl]-0-|"; hFormat = @"H:|[pageControl]|"; break; } case ICPageControlPosition_BottomRight: { vFormat = @"V:[pageControl]-0-|"; hFormat = @"H:[pageControl]-|"; break; } default: break; } [self removeConstraints:self.pageControlConstraints]; NSArray *pageControlVConstraints = [NSLayoutConstraint constraintsWithVisualFormat:vFormat options:kNilOptions metrics:nil views:@{@"pageControl": self.pageControl}]; NSArray *pageControlHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:hFormat options:kNilOptions metrics:nil views:@{@"pageControl": self.pageControl}]; [self.pageControlConstraints removeAllObjects]; [self.pageControlConstraints addObjectsFromArray:pageControlVConstraints]; [self.pageControlConstraints addObjectsFromArray:pageControlHConstraints]; [self addConstraints:self.pageControlConstraints]; } - (void)setHidePageControl:(BOOL)hidePageControl { self.pageControl.hidden = hidePageControl; } @end
用的时候要首先引入类库ImageIO.framework
初始化View
self.imagePlayerView=[[ImagePlayerView alloc]init]; self.imagePlayerView.frame=CGRectMake(0, 0, self.view.bounds.size.width, 150); [self.imagePlayerView initWithCount:self.homeData.adList.count delegate:self]; self.imagePlayerView.scrollInterval = 3.0f; self.imagePlayerView.pageControlPosition = ICPageControlPosition_BottomCenter; self.imagePlayerView.hidePageControl = NO;
实现代理ImagePlayerViewDelegate
#pragma mark --- ---ImagePlayerViewDelegate - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView loadImageForImageView:(UIImageView *)imageView index:(NSInteger)index { AdModel *admodel=[self.homeData.adList objectAtIndex:index]; NSURL *url=[NSURL URLWithString:admodel.imageUrl]; imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]]; } - (void)imagePlayerView:(ImagePlayerView *)imagePlayerView didTapAtIndex:(NSInteger)index { NSLog(@"did tap index = %d", (int)index); }
时间: 2024-10-11 07:07:58