IOS開發學習筆記十三 UIScrollView控制元件實現輪播圖
阿新 • • 發佈:2018-11-13
效果圖:專案地址
程式碼:
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollViewContent;
@property (weak, nonatomic) IBOutlet UIImageView *ivLastView;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollViewSlider;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
// 建立一個用來引用計時器物件的屬性
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
// 實現UIScrollView的滾動方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 如何計算當前滾動到了第幾頁?
// 1. 獲取滾動的x方向的偏移值
CGFloat offsetX = scrollView.contentOffset .x;
// 用已經偏移了得值, 加上半頁的寬度
offsetX = offsetX + (scrollView.frame.size.width * 0.5);
// 2. 用x方向的偏移的值除以一張圖片的寬度(每一頁的寬度),取商就是當前滾動到了第幾頁(索引)
int page = offsetX / scrollView.frame.size.width;
// 3. 將頁碼設定給UIPageControl
self.pageControl.currentPage = page;
NSLog(@"滾了,要在這裡根據當前的滾動來計算當前是第幾頁。" );
}
// 實現即將開始拖拽的方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
// 停止計時器
// 呼叫invalidate一旦停止計時器, 那麼這個計時器就不可再重用了。下次必須重新建立一個新的計時器物件。
[self.timer invalidate];
// 因為當呼叫完畢invalidate方法以後, 這個計時器物件就已經廢了,無法重用了。所以可以直接將self.timer設定為nil
self.timer = nil;
}
// 實現拖拽完畢的方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
// 重新啟動一個計時器
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
// 再次修改一下新建立的timer的優先順序
// 修改self.timer的優先順序與控制元件一樣
// 獲取當前的訊息迴圈物件
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 改變self.timer物件的優先順序
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *sandBox = NSHomeDirectory();
NSLog(@"%@", sandBox);
CGFloat maxH = CGRectGetMaxY(self.ivLastView.frame);
// 設定UIScrollView的contentSize
self.scrollViewContent.contentSize = CGSizeMake(0, maxH);
// 設定預設滾動位置
self.scrollViewContent.contentOffset = CGPointMake(0, -44);
// 設定距離上面的始終有74的內邊距
self.scrollViewContent.contentInset = UIEdgeInsetsMake(44, 0, 54, 0);
[self initSlider];
}
- (void)initSlider{
// 動態建立UIImageView新增到UIScrollView中
CGFloat imgW = 375;
CGFloat imgH = 168;
CGFloat imgY = 0;
// 1. 迴圈建立5個UIImageView新增到ScrollView中
for (int i = 0; i < 5; i++) {
// 建立一個UIImageView
UIImageView *imgView = [[UIImageView alloc] init];
// 設定UIImageView中的圖片
NSString *imgName = [NSString stringWithFormat:@"img_%02d", i + 1];
imgView.image = [UIImage imageNamed:imgName];
// 計算每個UIImageView在UIScrollView中的x座標值
CGFloat imgX = i * imgW;
// 設定imgView的frame
imgView.frame = CGRectMake(imgX, imgY, imgW, imgH);
// 把imgView新增到UIScrollView中
[self.scrollViewSlider addSubview:imgView];
}
// 設定UIScrollView的contentSize(內容的實際大小)
CGFloat maxW = self.scrollViewSlider.frame.size.width * 5;
self.scrollViewSlider.contentSize = CGSizeMake(maxW, 0);
// 實現UIScrollView的分頁效果
// 當設定允許分頁以後, UIScrollView會按照自身的寬度作為一頁來進行分頁。
self.scrollViewSlider.pagingEnabled = YES;
// 隱藏水平滾動指示器
self.scrollViewSlider.showsHorizontalScrollIndicator = NO;
// 指定UIPageControl的總頁數
self.pageControl.numberOfPages = 5;
// 指定預設是第0頁
self.pageControl.currentPage = 0;
// 建立一個"計時器"控制元件NSTimer控制元件
// 通過scheduledTimerWithInterval這個方法建立的計時器控制元件, 建立好以後自動啟動
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
// 修改self.timer的優先順序與控制元件一樣
// 獲取當前的訊息迴圈物件
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 改變self.timer物件的優先順序
[runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
}
// 自動滾動圖片的方法
// 因為在建立計時器的時候, 指定了時間間隔是1.0秒,所以下面這個方法每隔一秒鐘執行一次
- (void)scrollImage
{
// 每次執行這個方法的時候, 都要讓圖片滾動到下一頁
// 如何讓UIScrollView滾動到下一頁?
// 1. 獲取當前的UIPageControl的頁碼
NSInteger page = self.pageControl.currentPage;
NSLog(@"當前page ==== %d",page);
// 2. 判斷頁碼是否到了最後一頁, 如果到了最後一頁, 那麼設定頁碼為0(回到第一頁)。如果沒有到達最後一頁, 則讓頁碼+1
if (page == self.pageControl.numberOfPages - 1) {
// 表示已經到達最後一頁了
page = 0; // 回到第一頁
} else {
page++;
}
NSLog(@"計算後的page ==== %d",page);
// 3. 用每頁的寬度 * (頁碼 + 1) == 計算除了下一頁的contentOffset.x
CGFloat offsetX = self.scrollViewSlider.frame.size.width*page;
NSLog(@"計算後的offsetX ==== %d",offsetX);
// 4. 設定UIScrollView的contentOffset等於新的偏移的值
[self.scrollViewSlider setContentOffset:CGPointMake(offsetX, 0) animated:YES];
// 如果圖片現在已經滾動到最後一頁了, 那麼就滾動到第一頁
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end