AutoLayout以来UIView和UIViewController新增的相关API
UILayoutSupport
Java
从iOS 7以来,当我们的视图控制器结构中有NavigationBar,TabBar或者ToolBar的时候,它们的translucent属性的默认值改为 了YES,并且当前的ViewController的高度会是整个屏幕的高度。(比如一个场景:拖动TableView的时候,上面的 NavigationBar能够透过去看到TableView的内容。)@property(nonatomic,readonly,retain) id<UILayoutSupport> topLayoutGuide NS_AVAILABLE_IOS(7_0); @property(nonatomic,readonly,retain) id<UILayoutSupport> bottomLayoutGuide NS_AVAILABLE_IOS(7_0); @protocol UILayoutSupport <NSObject> @property(nonatomic,readonly) CGFloat length; @end
从iOS 7以来,当我们的视图控制器结构中有NavigationBar,TabBar或者ToolBar的时候,它们的translucent属性的默认值改为 了YES,并且当前的ViewController的高度会是整个屏幕的高度。(比如一个场景:拖动TableView的时候,上面的 NavigationBar能够透过去看到TableView的内容。)
为了确保我们的视图不被这些Bar覆盖,我们可以在我们AutoLayout布局中使用topLayoutGuide和bottomLayoutGuide这两个属性。像这样:
NSDictionary *views = @{"topLayoutGuide" : self.topLayoutGuide, @"myLabel" : myLabel}; [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide]-[myView]" options:0 metrics:nil views:views]
这个时候我们的视图就不会被Bar所覆盖,显示在了Bar下方:
并且使用这个属性布局时,在traitCollection改变时(旋转屏幕),它的值也会动态变化。上述代码,在横屏情况下,navigationbar高度变了之后,仍然能够正确显示。
这两个guides的计算方式如下:
topLayoutGuide是通过计算 View Controller->View->Top 到 覆盖这个View最下层的那个Bar(像Navigation Bar) -> Bottom 的距离
bottomLayoutGuide是通过计算 View Controller->View->Bottom 到 覆盖这个View上层那个Bar(像Tab bar) -> Top 的距离
如果我们不使用AutoLayout布局,我们也可以通过Guide的length属性获得相应的距离。我们应该在-viewDidLayoutSubviews或者-layoutSubviews调用super之后,再去获得length这个值,以确保正确。
UIConstraintBasedLayoutCoreMethods
- (void)updateViewConstraints NS_AVAILABLE_IOS(6_0);
UIViewController中也新增了一个更新布局约束的方法,在AutoLayout UIView相关API的笔记中,详细讲述了UIView的一组更新布局约束的方法。
这个方法默认的实现是调用对应View的 -updateConstraints 。ViewController的View在更新视图布局时,会先调用ViewController的updateViewConstraints 方法。我们可以通过重写这个方法去更新当前View的内部布局,而不用再继承这个View去重写-updateConstraints方法。我们在重写这 个方法时,务必要调用 super 或者 调用当前View的 -updateConstraints 方法。
UITraitEnvironment
又一次看到了UITraitEnvironment协议,在UIKit Framework中,有四个类支持这个协议,分别是UIScreen, UIViewController,UIView 和 UIPresentationController。所以当视图的traitCollection改变时,UIViewController能够捕获到这 个消息,并做对应处理的。 更多解释可以参考上一篇文章详解UICoordinateSpace和UIScreen在iOS 8上的坐标问题。
关于Size Class和UITraitCollection的概念可参考如下链接:
WWDC 2014 Session笔记 – iOS界面开发的大一统 From: onecat’s Blog
iOS8 Size Classes的理解与使用 From: Joywii’s Blog
另外,UIViewController还另外提供了以下两个方法:
- (void)setOverrideTraitCollection:(UITraitCollection *)collection forChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0); - (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0);
我们可以通过调用ViewController的setOverrideTraitCollection方法为它的 ChildViewController重新设置traitCollection的值。一般情况下traitCollection值从父 controller传到子controller是不做修改的。当我们自己实现一个容器Controller的时候,我们可以使用这个方法进行调整。
相对的,我们可以通过overrideTraitCollectionForChildViewController方法获得ChildViewController的traitCollection值。
UIContentContainer
iOS 8上随着Size Class概念的提出,UIViewController支持了UIContentContainer这样一组新的协议:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71446.html
- 上一篇:C# 根据时间创建文件夹
- 下一篇:005] C#如何绑定HotKey