天天看点

UIViewController部分属性和方法介绍

// 视图对象,如果视图没被创建的话,为空

@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