iOS 自動循環播放廣告控件實現
摘要 iOS下實現的一個簡單的循環播放小廣告的控件,為了節約內存,使用三個imageview來實現
1.原理:圖片:圖片集合名稱保存成array;
輪播:為了實現滑動效果,至少需要三個imageview,為了確保左右滑動,需要一直顯示中間的view
每次滑動后都需要重新加載三個view的圖片。并設置當前圖片下標
2.接口:提供給viewcontroller一個判斷左右滑動的接口,并實現滑動效果
提供給pagecontroller一個設置頁面的接口,根據下標設置當前現實頁
3.代碼:ADScrollView,附詳細注釋
.h
@interface ADScrollView : UIScrollView {
NSTimer *_timer;
}
@property (nonatomic, retain) NSMutableArray *ads; // 圖集
@property (nonatomic, retain) NSMutableArray *images; // 視圖集合(三個視圖,左中右)
@property (nonatomic, assign) NSUInteger nowImageIndex; // 當前圖片下表
@property (nonatomic, assign) CGPoint curPoint; // 當前視圖坐標
- (void)changeToImage:(NSUInteger)index; // 改變到某個廣告,當我們點擊pagecontrol的某個頁時,將頁號作為參數竄過來,即可實現效果
// 滑動后,將最后的坐標點傳過來,即可判斷是左滑還是右滑,并實現滑動效果
// 返回1:右滑 -1:左滑 0:未滑動
- (NSInteger)scrollToPoint:(CGPoint)point;
@end
.m
@implementation ADScrollView
- (void)dealloc {
// 關閉定時器并釋放
[_timer invalidate];
_timer = nil;
}
- (id)init {
self = [super init];
if (self) {
self.ads = [NSMutableArray arrayWithObjects:@"ad01.png", @"ad02.png", @"ad03.jpg", nil];
// scroll的分頁設置
self.pagingEnabled = YES;
self.showsHorizontalScrollIndicator = NO;
self.showsVerticalScrollIndicator = NO;
self.contentSize = CGSizeMake(3 * 320, 100.0);
NSInteger kCount = [_ads count];
self.images = [[NSMutableArray alloc] initWithCapacity:3];
// 初始化三個切換頁
for (int i = 0; i < 3; i++) {
UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[_ads objectAtIndex:(i+kCount-1)%kCount]]];
view.frame = CGRectMake(i*320, 0, 320, 100);
[self addSubview:view];
[self.images addObject:view];
}
_nowImageIndex = 0;
self.bounds = CGRectMake(320, 0, 320, 100);
_curPoint = self.bounds.origin; // 當前左上角坐標
// 初始化定時器
_timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(scrollTimer) userInfo:nil repeats:YES];
//self.adDelegate = nil;
}
return self;
}
#pragma mark - 定時器
- (void)scrollTimer {
// 自動播放
[self scrollRectToVisible:CGRectMake(640, 0, 320, 100) animated:YES];
}
#pragma mark - 設置顯示第幾頁
- (void)changeToImage:(NSUInteger)index {
_nowImageIndex = index; // 當前視圖下標切換過去
// 設置三個view的顯示
self.bounds = CGRectMake(320, 0, 320, 100);
((UIImageView *)[self.images objectAtIndex:2]).image = [UIImage imageNamed:[self.ads objectAtIndex:[self getImageNext]]]; // 加載下一張視圖
((UIImageView *)[self.images objectAtIndex:1]).image = [UIImage imageNamed:[self.ads objectAtIndex:_nowImageIndex]]; // 加載當前窗口視圖
((UIImageView *)[self.images objectAtIndex:0]).image = [UIImage imageNamed:[self.ads objectAtIndex:[self getImagePre]]]; // 加載上一個窗口視圖
}
#pragma mark - 判斷左滑 右滑 實現滑動效果
- (NSInteger)scrollToPoint:(CGPoint)point {
NSInteger dictionary = 0;
if (point.x-_curPoint.x == 320.0 || point.x-_curPoint.x == -640.0) { // 右滑
_nowImageIndex = [self getImageNext]; // 獲取當前圖片下標
dictionary = 1;
}
else if (0 != point.x - _curPoint.x){ // 左滑
_nowImageIndex = [self getImagePre]; // 獲取當前圖片下標
dictionary = -1;
}
// 始終顯示的是中間視圖,只不過各個視圖加載的圖片變了
self.bounds = CGRectMake(320, 0, 320, 100);
((UIImageView *)[self.images objectAtIndex:2]).image = [UIImage imageNamed:[self.ads objectAtIndex:[self getImageNext]]]; // 加載下一張視圖
((UIImageView *)[self.images objectAtIndex:1]).image = [UIImage imageNamed:[self.ads objectAtIndex:_nowImageIndex]]; // 加載當前窗口視圖
((UIImageView *)[self.images objectAtIndex:0]).image = [UIImage imageNamed:[self.ads objectAtIndex:[self getImagePre]]]; // 加載上一個窗口視圖
return dictionary; // 如果是右滑 返回yes 左滑返回no
}
#pragma mark - 獲取圖片下標
- (NSInteger)getImageNext {
if (_nowImageIndex == [_ads count] - 1) {
return 0;
}
return _nowImageIndex + 1;
}
- (NSInteger)getImagePre {
if (0 == _nowImageIndex) {
return [_ads count]-1;
}
return _nowImageIndex-1;
}
@end
ViewController需要設置ADScrollView的委托,并實現兩個方法
// scrollview 滑動結束,響應手勢滑動處理
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
NSInteger dic = [_adScroll scrollToPoint:scrollView.bounds.origin];
if (1 == dic) { // 右滑
_page.currentPage = (_page.currentPage+1)%_page.numberOfPages;
}
else if (-1 == dic){ // 左滑
_page.currentPage = (_page.currentPage+_page.numberOfPages-1)%_page.numberOfPages;
}
}
// scrollview動作結束,響應自動輪播方式處理
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
NSInteger dic = [_adScroll scrollToPoint:scrollView.bounds.origin];
if (1 == dic) { // 右滑
_page.currentPage = (_page.currentPage+1)%_page.numberOfPages;
}
else if (-1 == dic){ // 左滑
_page.currentPage = (_page.currentPage+_page.numberOfPages-1)%_page.numberOfPages;
}
}
// uipageControl的響應方法
- (void)scrolTimer:(NSInteger)dictionary {
if (1 == dictionary) {
_page.currentPage = (_page.currentPage+_page.numberOfPages+1)%_page.numberOfPages;
}
else if(-1 == dictionary) {
_page.currentPage = (_page.currentPage+_page.numberOfPages-1)%_page.numberOfPages;
}
NSLog(@"%@",_adScroll);
}
ps:只需要這些設置就可以實現廣告的輪播了,
對于廣告的大小可以根據實際情況自己改,
我這個是320*100的尺寸
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!