UIPageControl

UIPageControl 是一個(gè)頁(yè)面控制器绑改,會(huì)在頁(yè)面上顯示為幾個(gè)小圓點(diǎn),常常和 UIScrollView 配合使用寸爆,實(shí)現(xiàn)輪播器之類的效果替废。

下面會(huì)展示一個(gè) UIPageControl 的使用示例。

目錄結(jié)構(gòu)

  • PageViewController
    PageViewController 的父類是 UIViewController绎晃,它是一個(gè)容器視圖控制器蜜唾,用于處理兩個(gè)子視圖之間的切換。
  • FirstSubViewController
    FirstSubViewController 的父類也是 UIViewController庶艾,褐色子視圖袁余。
  • SecondSubViewController
    SecondSubViewController 的父類也是 UIViewController,紫色子視圖咱揍。
視圖層次結(jié)構(gòu)

各模塊代碼

兩個(gè)子視圖只是簡(jiǎn)單地設(shè)置了一下背景顏色方便識(shí)別颖榜。

PageViewController

PageControllerViewController.m 文件代碼如下。

每一行都有很詳細(xì)的注釋煤裙。

#import "PageViewController.h"

// Framework
#import <YYKit.h>

// Controller
#import "FirstSubViewController.h"
#import "SecondSubViewController.h"


@interface PageViewController () <UIScrollViewDelegate>

// 滾動(dòng)視圖掩完,作為容器視圖
@property (nonatomic, strong) UIScrollView *scrollerView;
@property (nonatomic, strong) FirstSubViewController *firstVC;
@property (nonatomic, strong) SecondSubViewController *secondVC;

// 控制翻頁(yè)的屬性,使用它來(lái)控制滾動(dòng)視圖的翻頁(yè)硼砰。通過(guò)該組件中的小白點(diǎn)且蓬,來(lái)觀察當(dāng)前頁(yè)面的位置
@property (nonatomic, strong) UIPageControl *pageControl;

// 狀態(tài)屬性,用來(lái)標(biāo)志頁(yè)面拖動(dòng)狀態(tài)
@property (nonatomic, assign) BOOL isPageControlUsed;

@end

@implementation PageViewController


#pragma mark - Lifecycle

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 添加容器視圖
    [self.view addSubview:self.scrollerView];
    // 添加頁(yè)面控制小圓點(diǎn)
    [self.view addSubview:self.pageControl];
    
    // 首先獲取當(dāng)前屏幕的尺寸
    CGRect screenFrame = [[UIScreen mainScreen] bounds];

    // 創(chuàng)建第一個(gè)視圖控制器對(duì)象的實(shí)例
    _firstVC = [[FirstSubViewController alloc] init];
    // 設(shè)置坐標(biāo)原點(diǎn)的縱向值為0
    screenFrame.origin.y = 0;
    // 設(shè)置第一個(gè)視圖控制器對(duì)象的顯示區(qū)域
    _firstVC.view.frame = screenFrame;
    
    // 創(chuàng)建第二個(gè)視圖控制器對(duì)象的實(shí)例
    _secondVC = [[SecondSubViewController alloc] init];
    // 設(shè)置坐標(biāo)原點(diǎn)的X值為屏幕寬度题翰,即第二個(gè)視圖控制器對(duì)象顯示在屏幕之外(右側(cè))
    screenFrame.origin.x = screenFrame.size.width;
    // 設(shè)置第二個(gè)視圖控制器對(duì)象的顯示區(qū)域
    _secondVC.view.frame = screenFrame;
    
    // 將兩個(gè)視圖添加到滾動(dòng)視圖對(duì)象里
    [self.scrollerView addSubview:_firstVC.view];
    [self.scrollerView addSubview:_secondVC.view];
}


#pragma mark - Custom Accessors

- (UIScrollView *)scrollerView {
    if (!_scrollerView) {
        // 初始化滾動(dòng)視圖對(duì)象恶阴,并設(shè)置滾動(dòng)視圖的尺寸信息
        _scrollerView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // 設(shè)置滾動(dòng)視圖為分頁(yè)模式,即每滾動(dòng)一次就是一頁(yè)
        _scrollerView.pagingEnabled = YES;
        // 我們有兩個(gè)頁(yè)面遍愿,所以將滾動(dòng)視圖的“取景范圍”的寬度存淫,設(shè)置為兩倍頁(yè)面寬度
        _scrollerView.contentSize = CGSizeMake(kScreenWidth * 2, kScreenHeight);
        // 設(shè)置滾動(dòng)視圖的背景色為白色
        _scrollerView.backgroundColor = [UIColor whiteColor];
        // 設(shè)置滾動(dòng)視圖對(duì)象的代理為當(dāng)前類,這樣就可以在當(dāng)前文件中沼填,編寫代理方法桅咆,以捕捉滾動(dòng)視圖的相關(guān)動(dòng)作
        _scrollerView.delegate = self;
    }
    return _scrollerView;
}

- (UIPageControl *)pageControl {
    if (!_pageControl) {
        // 創(chuàng)建一個(gè)區(qū)域,顯示頁(yè)面控制器對(duì)象
        int pcHeight = 50;
        // 設(shè)置頁(yè)面控制器對(duì)象的顯示區(qū)域
        CGRect rect = CGRectMake(0, kScreenHeight - pcHeight * 2, kScreenWidth, pcHeight);
        
        // 初始化頁(yè)面控制器對(duì)象
        _pageControl = [[UIPageControl alloc] initWithFrame:rect];
        // 設(shè)置總頁(yè)數(shù)
        _pageControl.numberOfPages = 2;
        // 設(shè)置當(dāng)前頁(yè)編號(hào)
        _pageControl.currentPage = 0;
        // 設(shè)置頁(yè)面控制器對(duì)象的背景顏色為透明色
        _pageControl.backgroundColor = [UIColor clearColor];
        // 給頁(yè)面控制器對(duì)象坞笙,添加監(jiān)聽(tīng)頁(yè)面切換事件的方法
        [_pageControl addTarget:self
                         action:@selector(pageControlDidChanged:)
                    forControlEvents:UIControlEventValueChanged];
    }
    return _pageControl;
}


#pragma mark - IBActions

// 創(chuàng)建監(jiān)聽(tīng)頁(yè)面切換事件的方法
- (void)pageControlDidChanged:(id)sender {
    // 獲得當(dāng)前頁(yè)面控制器對(duì)象的顯示頁(yè)碼
    NSInteger currentPage = self.pageControl.currentPage;
    // 獲得滾動(dòng)視圖當(dāng)前顯示區(qū)域
    CGRect frame = self.scrollerView.frame;
    // 根據(jù)頁(yè)面控制器對(duì)象的當(dāng)前頁(yè)碼岩饼,計(jì)算滾動(dòng)視圖在下一頁(yè)的顯示區(qū)域
    frame.origin.x = frame.size.width * currentPage;
    frame.origin.y = 0;
    
    // 滾動(dòng)視圖到目標(biāo)位置
    [self.scrollerView scrollRectToVisible:frame animated:YES];
    // 設(shè)置通過(guò)頁(yè)面控制器對(duì)象切換頁(yè)面
    _isPageControlUsed = YES;
}


#pragma mark - UIScrollViewDelegate

// 創(chuàng)建監(jiān)聽(tīng)滾動(dòng)視圖的滾動(dòng)事件的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    // 如果是通過(guò)【頁(yè)面控制器對(duì)象切換】荚虚,則不執(zhí)行后面的代碼
    if (_isPageControlUsed) {
        return;
    }
    
    // 如果是【手指滑動(dòng)切換】,要同步當(dāng)前視圖所對(duì)應(yīng)的頁(yè)面控制器頁(yè)碼值
    // 獲得滾動(dòng)視圖的寬度值
    CGFloat pageWidth = self.scrollerView.frame.size.width;
    // 根據(jù)滾動(dòng)視圖的寬度值和橫向位移量籍茧,計(jì)算當(dāng)前頁(yè)碼
    // floor() 向下取整版述,得出 0 或者 1
    int page = floor((self.scrollerView.contentOffset.x - pageWidth/2) / pageWidth) + 1;
    // 設(shè)置頁(yè)面控制器的顯示頁(yè)碼,為通過(guò)計(jì)算所得的頁(yè)碼
    self.pageControl.currentPage = page;
}

// 創(chuàng)建監(jiān)聽(tīng)滾動(dòng)視圖的滾動(dòng)減速事件的代理方法寞冯。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // 重置標(biāo)識(shí)變量的默認(rèn)值
    _isPageControlUsed = NO;
}

@end
示例效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渴析,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吮龄,更是在濱河造成了極大的恐慌俭茧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓帚,死亡現(xiàn)場(chǎng)離奇詭異母债,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)尝抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門毡们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昧辽,你說(shuō)我怎么就攤上這事衙熔。” “怎么了奴迅?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵青责,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我取具,道長(zhǎng),這世上最難降的妖魔是什么扁耐? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任暇检,我火速辦了婚禮,結(jié)果婚禮上婉称,老公的妹妹穿的比我還像新娘块仆。我一直安慰自己,他們只是感情好王暗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布悔据。 她就那樣靜靜地躺著,像睡著了一般俗壹。 火紅的嫁衣襯著肌膚如雪科汗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天绷雏,我揣著相機(jī)與錄音头滔,去河邊找鬼怖亭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坤检,可吹牛的內(nèi)容都是我干的兴猩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼早歇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倾芝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起箭跳,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛀醉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衅码,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拯刁,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年逝段,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垛玻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奶躯,死狀恐怖帚桩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘹黔,我是刑警寧澤账嚎,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站儡蔓,受9級(jí)特大地震影響郭蕉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喂江,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一召锈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧获询,春花似錦涨岁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至尝哆,卻和暖如春秉撇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工畜疾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴邻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓啡捶,卻偏偏與公主長(zhǎng)得像姥敛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞎暑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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