UIScrollVIew和UIPageControl學(xué)習(xí)使用

概要

對于同一個頁面需要展示很多圖片信息掖鱼、子視圖等的這樣的需求,我們可以采用控件UIScrollVIew,與之常常一起使用的控件是UIPageControl,UIScrollVIew里面可以存放多個子視圖,通過設(shè)置頁模式,以及子頁面在UIScrollVIewcontent位置简卧,可以在滑動控件UIScrollVIew的時候切換子視圖。為了交互友好烤芦,常常和控件UIPageControl一起使用举娩,該控件是一組指示器,一般指示器個數(shù)對應(yīng)于上述的子頁面?zhèn)€數(shù)构罗,通過改組指示器可以看到當(dāng)前子頁面的位置以及整個UIScrollVIew的子視圖情況铜涉。

結(jié)果展示

主要技術(shù)點

  1. UIScrollVIew是存放需要顯示的界面的,UIPageControl指示的是UIScrollVIew的子視圖信息遂唧,包括當(dāng)前頁骄噪、總頁數(shù)

  2. 要使得UIScrollVIew支持頁模式需要將屬性pagingEnabled設(shè)為YES,這樣滾動都是按頁滾動的

  3. UIScrollVIew添加頁(子視圖)的時候需要知道,因為該控件的分頁和翻頁是根據(jù)content區(qū)域構(gòu)建的蠢箩,所以每個頁都有自己的頁區(qū)域链蕊,而且這些也一般設(shè)為連續(xù)的,所以記得設(shè)置子頁的framecontent的某區(qū)域谬泌,而且UIScrollVIewcontent要剛好容納子頁滔韵。如果content過大,導(dǎo)致子頁翻完了掌实,還能翻到空白區(qū)陪蜻;小了,則部分視圖不會顯示了贱鼻。

  4. 一開始我通過重寫方法- (void) addSubview:(UIView *)view添加子頁的宴卖,不過發(fā)現(xiàn)UIScrollVIew子頁數(shù)不對,后來才發(fā)現(xiàn)有程序自動調(diào)用了該方法邻悬,導(dǎo)致子頁數(shù)不對(好像多了兩個子頁)症昏。所以后來修改方法為- (void) addSubview:(UIView *)view forCurrent:(BOOL)current

  5. 為了能夠手動設(shè)置控件UIScrollVIew顯示的子頁父丰,需要使用方法scrollRectToVisible:animated:,其中rect是指子頁的位置肝谭,如

     CGRect rect = CGRectMake(page*_pageSize.width, 0, _pageSize.width, _pageSize.height);
     
     /** 移到可視區(qū) */
     [self scrollRectToVisible:rect animated:animated];
    
  6. 為了更新控件UIScrollVIewUIPageControl,需要給他們分別設(shè)置代理和方法蛾扇。給控件UIScrollVIew設(shè)置代理攘烛,同時實現(xiàn)方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView;給控件UIPageControl添加方法- (void) onChangePage镀首,如:

     #pragma 實現(xiàn)協(xié)議UIScrollViewDelegate
     - (void)scrollViewDidScroll:(UIScrollView *)scrollView
     {
         NSInteger page = scrollView.contentOffset.x / _pageView.pageSize.width;
         
         if(page != _pageController.currentPage)
         {
             _pageController.currentPage = page;
         };
     }
     
     - (void) onChangePage
     {
         [_pageView setCurrentPage:_pageController.currentPage animated:YES];
     }
    

主要代碼

自定義的UIScrollView

//
//  PageView.m
//  PageView 繼承自 UIScrollView
//
//  Created by arbboter on 14/12/24.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "PageView.h"

@interface PageView ()

@end

@implementation PageView

- (id) initWithFrame:(CGRect)frame
{
    if(self=[super initWithFrame:frame])
    {
        /** 頁模式 */
        self.pagingEnabled = YES;
        self.pageSize = frame.size;
    }
    
    return self;
}

/* 默認(rèn)的addSubview:方法會被調(diào)用坟漱, 所以為了區(qū)分所需的添加照片,重載或者定義其他方法 */
- (void) addSubview:(UIView *)view forCurrent:(BOOL)current
{
    NSInteger nPage = [self.subviews count];
    
    /** 新添加的子頁都對應(yīng)content的某個區(qū)域 */
    view.frame = CGRectMake(nPage*_pageSize.width, 0, _pageSize.width, _pageSize.height);
    nPage++;
    self.contentSize = CGSizeMake(nPage*_pageSize.width, _pageSize.height);
    [super addSubview:view];
    
    if(current)
    {
        [self setCurrentPage:nPage-1 animated:NO];
    }
}

/** 設(shè)置頁面page可見更哄,需要把視圖的content的對應(yīng)部分移到可視區(qū) */
- (void) setCurrentPage:(NSInteger)page animated:(BOOL)animated
{
    if(page >= [self.subviews count])
    {
        return;
    }
    
    CGRect rect = CGRectMake(page*_pageSize.width, 0, _pageSize.width, _pageSize.height);
    
    /** 移到可視區(qū) */
    [self scrollRectToVisible:rect animated:animated];
}

@end

程序控制類

//
//  ViewController.m
//  PageView 
//
//  Created by arbboter on 14/12/24.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "ViewController.h"
#import "PageView.h"

@interface ViewController ()  <UIScrollViewDelegate>

@property (nonatomic, retain) PageView* pageView;
@property (nonatomic, retain) UIPageControl* pageController;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    CGRect frame = self.view.frame;
    PageView* scrollView = [[PageView alloc] initWithFrame:frame];
    self.pageView = scrollView;
    /** 設(shè)置代理芋齿,使得視圖滾動時更新其他控件 */
    scrollView.delegate = self;
    [self.view addSubview:scrollView];
    [scrollView release];
    
    frame.origin.y += frame.size.height*7/8;
    frame.size.height = frame.size.height/8;
    
    UIPageControl* pageCtrl = [[UIPageControl alloc] initWithFrame:frame];
    self.pageController = pageCtrl;
    /** 非當(dāng)前頁的指示器顏色 */
    pageCtrl.pageIndicatorTintColor = [UIColor blueColor];
    /** 當(dāng)前頁的指示器顏色 */
    pageCtrl.currentPageIndicatorTintColor = [UIColor greenColor];
    [self.view insertSubview:pageCtrl aboveSubview:self.pageView];
    /** 頁面指示器變化時须眷,scroll更新 */
    [pageCtrl addTarget:self action:@selector(onChangePage) forControlEvents:UIControlEventValueChanged];
    [pageCtrl release];
    
    /** 加載圖片 */
    int nImage = 8;
    NSString* imageName = nil;
    for (int i=0; i<nImage; i++)
    {
        imageName = [[NSString alloc] initWithFormat:@"%d.jpg", i+1];
        UIImageView* imageView = [[UIImageView alloc] initWithFrame:self.pageView.frame];
        imageView.contentMode = UIViewContentModeScaleAspectFit;
        imageView.image = [UIImage imageNamed:imageName];
        imageView.backgroundColor = [UIColor colorWithRed:(arc4random()%30)/100 green:(arc4random()%30)/100 blue:(arc4random()%30)/100 alpha:1.0];
        [self.pageView addSubview:imageView forCurrent:NO];
        [imageView release];
        [imageName release];
    }
    
    /** 設(shè)置頁指示器總個數(shù) */
    self.pageController.numberOfPages = [self.pageView.subviews count];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma 實現(xiàn)協(xié)議UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSInteger page = scrollView.contentOffset.x / _pageView.pageSize.width;
    
    if(page != _pageController.currentPage)
    {
        _pageController.currentPage = page;
    };
}

- (void) onChangePage
{
    [_pageView setCurrentPage:_pageController.currentPage animated:YES];
}

@end

項目工程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沟突,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捕传,老刑警劉巖惠拭,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庸论,居然都是意外死亡职辅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門聂示,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域携,“玉大人,你說我怎么就攤上這事鱼喉⌒惚蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵扛禽,是天一觀的道長锋边。 經(jīng)常有香客問我,道長编曼,這世上最難降的妖魔是什么豆巨? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮掐场,結(jié)果婚禮上往扔,老公的妹妹穿的比我還像新娘。我一直安慰自己熊户,他們只是感情好萍膛,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚷堡,像睡著了一般卦羡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麦到,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天绿饵,我揣著相機與錄音,去河邊找鬼瓶颠。 笑死拟赊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粹淋。 我是一名探鬼主播吸祟,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瑟慈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屋匕?” 一聲冷哼從身側(cè)響起葛碧,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎过吻,沒想到半個月后进泼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡纤虽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年乳绕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼纸。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡洋措,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杰刽,到底是詐尸還是另有隱情菠发,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布贺嫂,位于F島的核電站雷酪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涝婉。R本人自食惡果不足惜哥力,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墩弯。 院中可真熱鬧吩跋,春花似錦、人聲如沸渔工。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽引矩。三九已至梁丘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺韭,已是汗流浹背氛谜。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留区端,地道東北人值漫。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像织盼,于是被迫代替她去往敵國和親杨何。 傳聞我的和親對象是個殘疾皇子酱塔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 說明:開發(fā)環(huán)境為XCode7 beta5 引導(dǎo)頁和廣告欄的制作都是基于UIScrollView,因此它們有許多相似...
    EgeTart閱讀 6,128評論 13 29
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1危虱,想要解決就用__block...
    炙冰閱讀 2,486評論 1 14
  • 今天看微博埃跷,發(fā)現(xiàn)李宗盛和梁靜茹合唱的《明明白白我的心》演唱會視頻上了熱搜蕊玷。 在視頻中,李宗盛第一句就說:那個小女生...
    當(dāng)向上翊遇上文藝翊閱讀 823評論 0 0
  • 碎碎念: 剛跑步回來捌蚊,いよいよ今日になった~終于是到了今天。 早上其實六點多就醒了近弟,但是實在是太瞌睡了缅糟,到最后還是...
    橘子是怪獸閱讀 280評論 0 2
  • 前言: 有些時候,你會發(fā)現(xiàn)祷愉,與你相伴數(shù)年的人一直愛著你窗宦! 這是L與Y的故事! 他們相伴數(shù)年二鳄,相互玩鬧赴涵,...
    四夕日木閱讀 629評論 1 1