// 视图对象,如果视图没被创建的话,为空
@property(nonatomic, readonly, strong) UIView *viewIfLoaded
// 视图大小
@property(nonatomic) CGSize preferredContentSize
// 如果视图没被创建的话,创建视图,开始于iOS9
- (void)loadViewIfNeeded
// 我们现在有了新的展示 viewController 的方法,-showViewController:sender: 以及 -showDetailViewController:sender:。调用这两个方法时,将顺着包括调用 vc 自身的响应链而上,寻找最近的实现了这个方法的 ViewController 来执行相应代码。在 iOS SDK 的默认实现中,在 UISplitViewController 这样的容器类中,已经有这两个方法的实现方式,而 UINavigationController 也实现了 -showViewController:sender: 的版本。对于在 navController 栈中的 vc,会调用 push 方式进行展示,而对 splitVC,showViewController:sender: 将在 MasterViewController 中进行 push。而 showDetailViewController:sender: 将根据水平方向的 Size 的情况进行选择:对于 Regular 的情况,将在 DetailViewController 中显示新的 vc,而对于 Compact 的情况,将由所在上下文情况发回给下级的 navController 或者是直接以 modal 的方式展现。
这么设计的好处是显而易见的,首先是解除了原来的耦合,使得我们的 ViewController 可以不被局限于导航控制器上下文中;另外,这几个方法都是公开的,也就是说我们的 ViewController 可以实现这两个方法,截断响应链的响应,并实现我们自己的呈现方式。这在自定义 Container Controller 的时候会非常有用。
开始于iOS8
- (void)showViewController:(UIViewController *)vc
sender:(id)sender
- (void)showDetailViewController:(UIViewController *)vc
sender:(id)sender
// 决定当前显示其它controller的controller是否提供context给presentedViewController(modalViewController),如果不,就会找上一级的controller的该值
@property(nonatomic, assign) BOOL definesPresentationContext
//是否使用视图控制器的过过渡样式
@property(nonatomic, assign) BOOL providesPresentationContextTransitionStyle
/// 是否控制键盘关闭
- (BOOL)disablesAutomaticKeyboardDismissal
// 转场的代理
@property(nonatomic, weak) id< UIViewControllerTransitioningDelegate > transitioningDelegate
// 转场对象
- (id<UIViewControllerTransitionCoordinator>)transitionCoordinator
// 获取响应事件的对象
- (UIViewController *)targetViewControllerForAction:(SEL)action
sender:(id)sender
// 最近的上一个UIViewController
@property(nonatomic, readonly) UIPresentationController *presentationController
// 最近关闭的控制器
@property(nonatomic, readonly) UIPopoverPresentationController *popoverPresentationController
// 边缘约束
@property(nonatomic, assign) UIRectEdge edgesForExtendedLayout
//延伸视图是否不透明的Bar,是用来指定导航栏是透明的还是不透明,IOS7中默认是YES
@property(nonatomic, assign) BOOL extendedLayoutIncludesOpaqueBars
// 是否自动调整ScrollView的Inset
@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets
// 界面显示时呈现的方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
// 尝试旋转方向
+ (void)attemptRotationToDeviceOrientation
// 在两个子视图控制器中转换
- (void)transitionFromViewController:(UIViewController *)fromViewController
toViewController:(UIViewController *)toViewController
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion
//在iOS6之后可以覆盖整个方法来关闭appearance callbacks的自动传递特性
- (BOOL)shouldAutomaticallyForwardAppearanceMethods
// 手动传递的时候你并不能直接去调用child 的viewWillAppear或者viewDidAppear这些方法,而是需要使用 beginAppearanceTransition:animated:和endAppearanceTransition接口来间接触发那些appearance callbacks,且begin和end必须成对出现
- (void)beginAppearanceTransition:(BOOL)isAppearing
animated:(BOOL)animated
- (void)endAppearanceTransition
// 我们可以通过调用ViewController的setOverrideTraitCollection方法为它的ChildViewController重新设置traitCollection的值。一般情况下traitCollection值从父controller传到子controller是不做修改的。当我们自己实现一个容器Controller的时候,我们可以使用这个方法进行调整。相对的,我们可以通过overrideTraitCollectionForChildViewController方法获得ChildViewController的traitCollection值。
- (void)setOverrideTraitCollection:(UITraitCollection *)collection
forChildViewController:(UIViewController *)childViewController
- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController
// 当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用
- (void)willMoveToParentViewController:(UIViewController *)parent
// 当一个视图控制器从视图控制器容器中被添加或者被删除之后,该方法被调用
- (void)didMoveToParentViewController:(UIViewController *)parent
// 注册3D Touch的显示view
- (id<UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate
sourceView:(UIView *)sourceView
// 移除3D Touch
- unregisterForPreviewingWithContext:
// 3D Touch相关按钮
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
//实现此方法来指定要控制的状态栏隐藏和取消隐藏状态
- (UIViewController *)childViewControllerForStatusBarHidden
//设置子控制器的状态栏样式
- (UIViewController *)childViewControllerForStatusBarStyle
// 是否管理状态栏
@property(nonatomic, assign) BOOL modalPresentationCapturesStatusBarAppearance
// 状态栏变化效果
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
// 更新状态栏
- (void)setNeedsStatusBarAppearanceUpdate
// 在UITabbarController包含的UINavigationController应用中,如果UINavigationController某一页(某个level)需要隐藏Tabbar,之前的做法是在push那一页之前,将那一页的ViewController中的hidesBottombarWhenPushed参数设为YES,这样当那一页push进UINavigationController中时,底部的Tabbar就会隐藏掉
@property(nonatomic) BOOL hidesBottomBarWhenPushed