iOS 의 UIPageViewController 페이지 넘 기기 컨트롤 러 인 스 턴 스 설명

13186 단어 iOSViewController
머리말
UIPageViewController 는 iOS 에서 보기 드 문 애니메이션 보기 컨트롤 러 중 하나 로 UIScrollView 와 UIPageControl 이 결 합 된 스크롤 백 보 기 를 만 들 수도 있 고 도서 효과 와 유사 한 시 크 한 페이지 넘 기기 보 기 를 만 들 수도 있다.
UIPageViewController 는 iOS 5 SDK 에서 처음으로 도입 되 었 습 니 다.이 ViewController 를 사용 하여 페이지 보 기 를 만 들 수 있 습 니 다.iOS 6 에 서 는 이 클래스 가 업데이트 되 어 스크롤 과도 효 과 를 지원 합 니 다.Page View 를 사용 하면 사용 자 는 손짓 을 통 해 여러 페이지 사 이 를 편리 하 게 탐색 할 수 있다.UIPageView Controller 는 안내 페이지 뿐만 아니 라 많은 게임 도 사용 합 니 다.예 를 들 어 앵 그리 버드 는 바로 Page View 로 관문 이 선택 한 페이지 를 보 여 주 는 것 입 니 다.그리고 관련 서적 의 응용 도 있 습 니 다.이런 종류 로 책의 페이지 를 보 여 줍 니 다.
UIPageViewController 는 고도 로 설정 할 수 있 는 클래스 입 니 다.다음 설정 을 할 수 있 습 니 다.
  • 페이지 의 방향-수평 또는 수직
  • 페이지 를 넘 기 는 스타일―책 을 넘 기거 나 미 끄 러 지 거나 넘 기 는 스타일
  • 책의 등심 위치―책 갈피 양식 만 유효 하 다
  • 페이지 간격―미끄럼 페이지 스타일 만 유효 하 며 페이지 간격(inter-page spacing)
  • 을 정의 합 니 다.
    UIPageViewController 는 하나의 보기 용기 와 유사 합 니 다.그 중에서 모든 구체 적 인 보 기 는 각자 의 ViewController 에서 유지 관 리 를 하고 UIPageViewController 는 애니메이션 과 조 화 롭 게 배치 합 니 다.다음 그림 은 UIPageViewControlelr 의 사용 구 조 를 잘 보 여 줍 니 다.
    201662491745638.png (1013×539)
    위의 그림 에서 UIPageViewController DataSource 프로 토 콜 은 UIPageViewController 에 데이터 지원 을 제공 하고 DataSource 프로 토 콜 이 제공 하 는 데 이 터 는 각 ViewContoller 에서 자체 적 으로 유지 하 며 UIPageViewController Delegate 의 리 셋 은 페이지 넘 기 동작,화면 회전 동작 등 을 감청 할 수 있다.UIPageViewController 는 DataSource 에서 가 져 온 보기 데 이 터 를 현재 보기 컨트롤 러 에 보 여 줍 니 다.
    시범 을 보이 기 위해 서,우 리 는 함께 간단 한 앱 을 만 들 것 이다.물론 모든 UIPageViewController 의 설정 디 테 일 을 보 여 주지 않 습 니 다.미끄럼 페이지 스타일 로 안내 페이지 를 만 드 는 것 을 보 여 드 리 겠 습 니 다.하지만 걱정 마 세 요.UIPageView Controller 에 대한 기본 적 인 이해 가 생 겼 으 니 다른 특성 을 탐색 할 수 있 을 거 라 고 믿 습 니 다.
    시작 합 시다!
    2.UIPageViewController 만 들 기
    먼저 페이지 넘 기기 컨트롤 러 의 구체 적 인 각 페이지 보기 컨트롤 러 로 UIViewController 에 계승 할 클래스 를 새로 만 듭 니 다.
    ModelViewController.h#import <UIKit/UIKit.h>
    @interface ModelViewController : UIViewController
    +(ModelViewController *)creatWithIndex:(int)index;
    @property(nonatomic,strong)UILabel * indexLabel;
    @end
    ModelViewController.m#import "ModelViewController.h"
    @interface ModelViewController ()
    @end
    @implementation ModelViewController
    +(ModelViewController *)creatWithIndex:(int)index{
        ModelViewController * con = [[ModelViewController alloc]init];
        con.indexLabel = [[UILabel alloc]initWithFrame:CGRectMake(110, 200, 100, 30)];
        con.indexLabel.text = [NSString stringWithFormat:@" %d ",index];
        [con.view addSubview:con.indexLabel];
        return con;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor redColor];
    }
    @end
    프로젝트 템 플 릿 이 자체 적 으로 가지 고 있 는 ViewController.m 파일 에서 다음 과 같은 코드 를 실현 합 니 다.#import "ViewController.h"
    #import "ModelViewController.h"
    //
    @interface ViewController ()<UIPageViewControllerDataSource,UIPageViewControllerDelegate>
    {
        //
        UIPageViewController * _pageViewControl;
        //
        NSMutableArray * _dataArray;
    }
    @end
    @implementation ViewController - (void)viewDidLoad {
        [super viewDidLoad];
        //
        _pageViewControl = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:@{UIPageViewControllerOptionSpineLocationKey:@0,UIPageViewControllerOptionInterPageSpacingKey:@10}];
        self.view.backgroundColor = [UIColor greenColor];
        //
        _pageViewControl.view.bounds=self.view.bounds;
        //
        _pageViewControl.dataSource=self;
        _pageViewControl.delegate=self;
        //
        ModelViewController * model = [ModelViewController creatWithIndex:1];
        //
        [_pageViewControl setViewControllers:@[model] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];
        //
        _pageViewControl.doubleSided = NO;
        _dataArray = [[NSMutableArray alloc]init];
        [_dataArray addObject:model];
        [self.view addSubview:_pageViewControl.view];
    }
    //
    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{
        int index = (int)[_dataArray indexOfObject:viewController];
        if (index==0) {
            return nil;
        }else{
            return _dataArray[index-1];
        }
    }
    //
    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{
        int index = (int)[_dataArray indexOfObject:viewController];
        if (index==9) {
            return nil;
        }else{
            if (_dataArray.count-1>=(index+1)) {
                return _dataArray[index+1];
            }else{
                ModelViewController * model = [ModelViewController creatWithIndex:index+2];
                [_dataArray addObject:model];
                return model;
            }
        }
    }
    //
    - (UIPageViewControllerSpineLocation) pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation{
        return UIPageViewControllerSpineLocationMin;
    }
    //
    - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
       
        return 10;
    }
    //
    - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController{
        return 0;
    }
    @end
    위 에 가장 간단 한 페이지 넘 기기 보기 컨트롤 러 예 시 를 만 들 었 습 니 다.효 과 는 다음 그림 과 같 습 니 다.
    201662491842840.png (240×426)
    3.UIPageViewController 에서 의 방법 사용 분석//
    - (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(nullable NSDictionary<NSString *, id> *)options;
    위의 방법 은 보기 컨트롤 러 대상 을 만 드 는 데 사 용 됩 니 다.그 중에서 UIPageViewController Transition Style 매개 변 수 는 페이지 넘 기기 컨트롤 러 의 스타일 을 설정 합 니 다.다음 과 같 습 니 다.typedef NS_ENUM(NSInteger, UIPageViewControllerTransitionStyle) {
        UIPageViewControllerTransitionStylePageCurl = 0, //
        UIPageViewControllerTransitionStyleScroll = 1 // ScrollView
    };
    UIPageView Controller Transition StyleCurl 로 설정 하면 다음 그림 과 같이 페이지 넘 기기 효과 가 있 습 니 다.
    201662491859309.png (240×426)
    위 에서 초기 화 하 는 방법 중의 UIPageView Controller Navigation Orientation 속성 은 페이지 를 넘 기 는 방향 을 설정 합 니 다.다음 과 같 습 니 다.typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationOrientation) {
        UIPageViewControllerNavigationOrientationHorizontal = 0,//
        UIPageViewControllerNavigationOrientationVertical = 1//
    };
    options 매개 변 수 는 페이지 넘 기기 컨트롤 러 의 설정 사전 을 설정 하 는 데 사 용 됩 니 다.설정 할 수 있 는 설정 키 는 다음 과 같 습 니 다.// UIPageViewControllerOptionSpineLocationKey NSNumber
    NSString * const UIPageViewControllerOptionSpineLocationKey;
    // NSNumber
    NSString * const UIPageViewControllerOptionInterPageSpacingKey;
    다음은 UIPageViewController 의 일반적인 속성 과 방법 입 니 다.//
    @property (nullable, nonatomic, weak) id <UIPageViewControllerDelegate> delegate;
    //
    @property (nullable, nonatomic, weak) id <UIPageViewControllerDataSource> dataSource;
    //
    @property (nonatomic, readonly) UIPageViewControllerTransitionStyle transitionStyle;
    //
    @property (nonatomic, readonly) UIPageViewControllerNavigationOrientation navigationOrientation;
    //
    @property (nonatomic, readonly) UIPageViewControllerSpineLocation spineLocation;
    //
    @property (nonatomic, getter=isDoubleSided) BOOL doubleSided;
    //
    - (void)setViewControllers:(nullable NSArray<UIViewController *> *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;
    위 에 spine Location 속성 만 이해 하기 어렵 고 다음 과 같다.typedef NS_ENUM(NSInteger, UIPageViewControllerSpineLocation) {
        // SCrollView
        UIPageViewControllerSpineLocationNone = 0,
        // View
        UIPageViewControllerSpineLocationMin = 1, 
        // View
        UIPageViewControllerSpineLocationMid = 2,
        // View
        UIPageViewControllerSpineLocationMax = 3  
    };
    위의 예제 코드 를 다음 과 같이 수정 합 니 다.- (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        _pageViewControl = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:@{UIPageViewControllerOptionSpineLocationKey:@2,UIPageViewControllerOptionInterPageSpacingKey:@10}];
        self.view.backgroundColor = [UIColor greenColor];
        _pageViewControl.view.bounds=self.view.bounds;
        _pageViewControl.dataSource=self;
        _pageViewControl.delegate=self;
        ModelViewController * model = [ModelViewController creatWithIndex:1];
        ModelViewController * model2 = [ModelViewController creatWithIndex:2];
        [_pageViewControl setViewControllers:@[model,model2] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];
        _pageViewControl.doubleSided = YES;
        _dataArray = [[NSMutableArray alloc]init];
        [_dataArray addObject:model];
        [self.view addSubview:_pageViewControl.view];
    }
    - (UIPageViewControllerSpineLocation) pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation{
        return UIPageViewControllerSpineLocationMid;
    }
    운행 효 과 는 다음 그림 과 같다.
    201662491917434.png (240×426)
    4.UIPageViewController DataSource 에서 의 방법 분석// ViewController
    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;
    // ViewController
    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;
    //
    - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0);
    //
    - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0);
    5.UIPageView Controller Delegate 에서 방법 분석//
    - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers NS_AVAILABLE_IOS(6_0);
    //
    - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed;
    // ,
    - (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation;

    좋은 웹페이지 즐겨찾기