iOS 의 UIPageViewController 페이지 넘 기기 컨트롤 러 인 스 턴 스 설명
                                            
 13186 단어  iOSViewController
                    
UIPageViewController 는 iOS 에서 보기 드 문 애니메이션 보기 컨트롤 러 중 하나 로 UIScrollView 와 UIPageControl 이 결 합 된 스크롤 백 보 기 를 만 들 수도 있 고 도서 효과 와 유사 한 시 크 한 페이지 넘 기기 보 기 를 만 들 수도 있다.
UIPageViewController 는 iOS 5 SDK 에서 처음으로 도입 되 었 습 니 다.이 ViewController 를 사용 하여 페이지 보 기 를 만 들 수 있 습 니 다.iOS 6 에 서 는 이 클래스 가 업데이트 되 어 스크롤 과도 효 과 를 지원 합 니 다.Page View 를 사용 하면 사용 자 는 손짓 을 통 해 여러 페이지 사 이 를 편리 하 게 탐색 할 수 있다.UIPageView Controller 는 안내 페이지 뿐만 아니 라 많은 게임 도 사용 합 니 다.예 를 들 어 앵 그리 버드 는 바로 Page View 로 관문 이 선택 한 페이지 를 보 여 주 는 것 입 니 다.그리고 관련 서적 의 응용 도 있 습 니 다.이런 종류 로 책의 페이지 를 보 여 줍 니 다.
UIPageViewController 는 고도 로 설정 할 수 있 는 클래스 입 니 다.다음 설정 을 할 수 있 습 니 다.
UIPageViewController 는 하나의 보기 용기 와 유사 합 니 다.그 중에서 모든 구체 적 인 보 기 는 각자 의 ViewController 에서 유지 관 리 를 하고 UIPageViewController 는 애니메이션 과 조 화 롭 게 배치 합 니 다.다음 그림 은 UIPageViewControlelr 의 사용 구 조 를 잘 보 여 줍 니 다.
 
 위의 그림 에서 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
 위 에 가장 간단 한 페이지 넘 기기 보기 컨트롤 러 예 시 를 만 들 었 습 니 다.효 과 는 다음 그림 과 같 습 니 다. 
 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 로 설정 하면 다음 그림 과 같이 페이지 넘 기기 효과 가 있 습 니 다. 
 위 에서 초기 화 하 는 방법 중의 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;
}
 운행 효 과 는 다음 그림 과 같다. 
 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;
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.