UIPageViewController的初介绍(1) ---API

简单介绍:
UIPageViewController是iOS 5 开始的分页控制器。
使用分页控制器(UIPageViewController)需要放置在一个父视图控制器中,在分页控制器下面还要有子视图控制器,每个子视图控制器对应图中的一个页面.

API里可以发现,属性绝大部分是只读的。而设置配置的信息需在的初始化方法中添加。

UIPageViewControllerNavigationOrientation : 导航翻页方向

typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationOrientation) {
#  默认水平方向 ,左右滑动或翻页
    UIPageViewControllerNavigationOrientationHorizontal = 0,
#垂直方向(上下滑动或翻页)
    UIPageViewControllerNavigationOrientationVertical = 1
};

UIPageViewControllerSpineLocation

脊梁的位置不同,屏幕显示页数不同。

要设置脊柱位置,请将一个这些常量包含在NSNumber对象中,并将其设置为传递给方法的选项字典中的键的值。
UIPageViewControllerOptionSpineLocationKey
方法:initWithTransitionStyle:navigationOrientation:options:

typedef NS_ENUM(NSInteger, UIPageViewControllerSpineLocation) {
#默认设置,没有脊梁
#当style 是UIPageViewControllerTransitionStylePageCurl是无效的
    UIPageViewControllerSpineLocationNone = 0, // Returned if 'spineLocation' is queried when 'transitionStyle' is not 'UIPageViewControllerTransitionStylePageCurl'.
# 一次显示一个视图控制器.
# 脊柱在屏幕的左边或顶边
# 从上往下翻页
    UIPageViewControllerSpineLocationMin = 1,  // Requires one view controller.
# 一次显示二个视图控制器.
# 脊柱在屏幕的中间
    UIPageViewControllerSpineLocationMid = 2,  // Requires two view controllers.
# 单页显示, 从下往上翻
# 脊柱在屏幕的右边或者下边
# 脊柱在屏幕的
    UIPageViewControllerSpineLocationMax = 3   // Requires one view controller.
};   // Only pertains to 'UIPageViewControllerTransitionStylePageCurl'.

UIPageViewControllerNavigationDirection

视图控制器的切换方向

typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationDirection) {
# 正向切换,切到下一页
    UIPageViewControllerNavigationDirectionForward,
# 反向切换,切到前一页
    UIPageViewControllerNavigationDirectionReverse
};  // For 'UIPageViewControllerNavigationOrientationHorizontal', 'forward' is right-to-left, like pages in a book. For 'UIPageViewControllerNavigationOrientationVertical', bottom-to-top, like pages in a wall calendar.
// 如果分页控制器设置为UIPageViewControllerNavigationOrientationHorizontal和forward,那页面从右到左,就书的翻页效果。
// 如果分页控制器设置为UIPageViewControllerNavigationOrientationVertical,那页面从下到上,页面就像一个挂历。

UIPageViewControllerTransitionStyle

两个页面过渡方式。

typedef NS_ENUM(NSInteger, UIPageViewControllerTransitionStyle) {
# 翻页
    UIPageViewControllerTransitionStylePageCurl = 0, // Navigate between views via a page curl transition.
# 滑动
    UIPageViewControllerTransitionStyleScroll = 1 // Navigate between views by scrolling.
};
// Key for specifying spine location in options dictionary argument to initWithTransitionStyle:navigationOrientation:options:.
// Value should be a 'UIPageViewControllerSpineLocation' wrapped in an NSNumber.
// Only valid for use with page view controllers with transition style 'UIPageViewControllerTransitionStylePageCurl'.

# 用在表示initWithTransitionStyle:navigationOrientation:options: 方法的options的字典参数的键(key),这个键表示脊柱定位。
# 表示UIPageViewControllerSpineLocation的数值被包装在NSNumber类型里
# 使用的分页控制器(page view controllers)的转场类型是UIPageViewControllerTransitionStylePageCurl才这个常量才有效

UIKIT_EXTERN NSString * const UIPageViewControllerOptionSpineLocationKey;

// Key for specifying spacing between pages in options dictionary argument to initWithTransitionStyle:navigationOrientation:options:.
// Value should be a CGFloat wrapped in an NSNumber. Default is '0'.
// Only valid for use with page view controllers with transition style 'UIPageViewControllerTransitionStyleScroll'.

# 一个键   在initWithTransitionStyle:navigationOrientation:options:方法的options的字典参数的键(key) ,表明页面间隔      
# CGFloat类型的值,被包装在NSNumber的类型里。默认是0.
# 使用的分页控制器(page view controllers)的转场类型是UIPageViewControllerTransitionStyleScroll 才这个常量才有效
UIKIT_EXTERN NSString * const UIPageViewControllerOptionInterPageSpacingKey NS_AVAILABLE_IOS(6_0);

@protocol UIPageViewControllerDelegate, UIPageViewControllerDataSource;

NS_CLASS_AVAILABLE_IOS(5_0) @interface UIPageViewController : UIViewController {
}

1、初始化方法

# 最常用的构造方式
/**
  *@param UIPageViewControllerTransitionStyle 转场类型
  *@param UIPageViewControllerNavigationOrientation 导航方向
  *@param options  一个字典,键是UIPageViewControllerOptionSpineLocationKey或者UIPageViewControllerOptionInterPageSpacingKey
*/
- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(nullable NSDictionary<NSString *, id> *)options NS_DESIGNATED_INITIALIZER;

- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;

2、属性

# 代理
@property (nullable, nonatomic, weak) id <UIPageViewControllerDelegate> delegate;
# 数据源代理
@property (nullable, nonatomic, weak) id <UIPageViewControllerDataSource> dataSource; // If nil, user gesture-driven navigation will be disabled.
# 转场方式
@property (nonatomic, readonly) UIPageViewControllerTransitionStyle transitionStyle;
# 导航方向
@property (nonatomic, readonly) UIPageViewControllerNavigationOrientation navigationOrientation;
# 书脊位置 
# 当转场类型是UIPageViewControllerTransitionStylePageCurl时,默认是UIPageViewControllerSpineLocationMin。否则是UIPageViewControllerSpineLocationNone。
@property (nonatomic, readonly) UIPageViewControllerSpineLocation spineLocation; // If transition style is 'UIPageViewControllerTransitionStylePageCurl', default is 'UIPageViewControllerSpineLocationMin', otherwise 'UIPageViewControllerSpineLocationNone'.

// Whether client content appears on both sides of each page. If 'NO', content on page front will partially show through back.
// If 'UIPageViewControllerSpineLocationMid' is set, 'doubleSided' is set to 'YES'. Setting 'NO' when spine location is mid results in an exception.

#  判断委托内容是否现在每个页面的两面。如果是NO,包含内容的页面的部分展示,前面展示而背面略过。
#  如果设置书脊位置是 UIPageViewControllerSpineLocationMid,doubleSided设置就是是yes。当 doubleSided 设置为0 ,则是书脊位置是中间的结果的一个异常。
@property (nonatomic, getter=isDoubleSided) BOOL doubleSided; // Default is 'NO'.

// An array of UIGestureRecognizers pre-configured to handle user interaction. Initially attached to a view in the UIPageViewController's hierarchy, they can be placed on an arbitrary view to change the region in which the page view controller will respond to user gestures.
// Only populated if transition style is 'UIPageViewControllerTransitionStylePageCurl'.

# 手势预配置数组去处理用户交互。首先附加到UIPageViewController的层级的一个view上。 他们可以放置在任意视图上,去改变分页控制器( page view controller) 回应用户手势的区域。
@property(nonatomic, readonly) NSArray<__kindof UIGestureRecognizer *> *gestureRecognizers;
@property (nullable, nonatomic, readonly) NSArray<__kindof UIViewController *> *viewControllers;

3、方法

// Set visible view controllers, optionally with animation. Array should only include view controllers that will be visible after the animation has completed.
// For transition style 'UIPageViewControllerTransitionStylePageCurl', if 'doubleSided' is 'YES' and the spine location is not 'UIPageViewControllerSpineLocationMid', two view controllers must be included, as the latter view controller is used as the back.

# 设置可视化控制器,可以选择添加动画。数组包含在动画完成后 ,将会可见视图控制器。
# 转场类型是UIPageViewControllerTransitionStylePageCurl,如果doubleSided是yes并且书脊位置不是UIPageViewControllerSpineLocationMid, 两个视图控制器必须包含在内。因为后者视图控制器作为后面。
- (void)setViewControllers:(nullable NSArray<UIViewController *> *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;

4、UIPageViewControllerDelegate

@protocol UIPageViewControllerDelegate <NSObject>
# 可选
@optional

// Sent when a gesture-initiated transition begins.
# 当开始手势转场开始时会被发送。
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers NS_AVAILABLE_IOS(6_0);

// Sent when a gesture-initiated transition ends. The 'finished' parameter indicates whether the animation finished, while the 'completed' parameter indicates whether the transition completed or bailed out (if the user let go early).
# 当开始手势转场结束时会被发送。
/**
*  @param  finished 表示动画是否完成
*  @param completed  表示 转场是否完成或者保释(如果用户更早释放页面)
*/
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed;

// Delegate may specify a different spine location for after the interface orientation change. Only sent for transition style 'UIPageViewControllerTransitionStylePageCurl'.
// Delegate may set new view controllers or update double-sided state within this method's implementation as well.

# 代理必须表明一个不同的书脊位置,为之后的界面方向改变准备。只有当转场类型是UIPageViewControllerTransitionStylePageCurl才会发送。

# 在这个方法的实现中,代理将会设置新的视图控制器或者更新双边状态
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation __TVOS_PROHIBITED;

- (UIInterfaceOrientationMask)pageViewControllerSupportedInterfaceOrientations:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
- (UIInterfaceOrientation)pageViewControllerPreferredInterfaceOrientationForPresentation:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

@end

5、 UIPageViewControllerDataSource

@protocol UIPageViewControllerDataSource <NSObject>

@required
# 必选方法
// In terms of navigation direction. For example, for 'UIPageViewControllerNavigationOrientationHorizontal', view controllers coming 'before' would be to the left of the argument view controller, those coming 'after' would be to the right.
// Return 'nil' to indicate that no more progress can be made in the given direction.
// For gesture-initiated transitions, the page view controller obtains view controllers via these methods, so use of setViewControllers:direction:animated:completion: is not required.

# 在导航方向的方面。例如,设置为
UIPageViewControllerNavigationOrientationHorizontal,视图控制器

# 返回nil,去表示在给定的方向,没有更多进展被创建
# 开始手势转场,页面视图控制器获取视图控制器是通过下面的这些方法,而不是setViewControllers:direction:animated:completion:获取。

# 向前翻页
- (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;

# 向后翻页
- (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;

@optional
# 可选方法
// A page indicator will be visible if both methods are implemented, transition style is 'UIPageViewControllerTransitionStyleScroll', and navigation orientation is 'UIPageViewControllerNavigationOrientationHorizontal'.
// Both methods are called in response to a 'setViewControllers:...' call, but the presentation index is updated automatically in the case of gesture-driven navigation.
# 如果下方二个方法都被实现、转场类型是UIPageViewControllerTransitionStyleScroll并且导航方向是UIPageViewControllerNavigationOrientationHorizontal页面的指示器将是可视的。

# 下方二个方法都被调用去响应'setViewControllers:...'的调用。但是在驱动手势导航的情况下 ,表示索引是自动更新。

// 在页面指示器中,items的个数被反应
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0); // The number of items reflected in the page indicator.
 // 在页面指示器中,被选中的item被反映
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController NS_AVAILABLE_IOS(6_0); // The selected item reflected in the page indicator.
@end

传送门:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 前面说了很多学习的底层思维和方法论,回到我们的最终目的还是要通过学习临界知识来达到高效率的学习与思考.我们已经了解...
    悠远的猫阅读 565评论 0 0
  • 五十六个名族心连心,共同创造了一个美好和谐的大家庭.五十六个名族要互相帮助才能有一个团结的大家庭,万众一心才能使我...
    水婉汝阅读 283评论 0 2
  • 百无聊赖的人生,你靠什么打动世界,然而你也不曾感动过自己!没有小资的清闲,没有大佬的阔绰,没有野佬的高逸,你靠什么...
    他城之樱阅读 178评论 1 1