其实这篇Blog并不完全是《精通 iOS 开发》的学习心得,而是有所延伸,因为这本书还是以 iOS 6 的 Xcode 版本来写的,而我现在的版本所用的方法完全不一样了。
屏幕旋转和自动布局这个话题在网上很多人写的Blog中有看到,但是 iOS 和 Xcode 的更新都很快,半年一年前的东西到现在已经不能用了。我费尽千辛万苦在百度谷歌上搜都搜不到相关内容,直到有一天我在 cocoachina 上看到一篇外国作者的作品的翻译。其实重写他人的内容好像感觉很没意思,不过就当记笔记了。
1.自动旋转
以前的版本中,自动旋转有几个方法,而现在只需这么几步就可以完成:
2.自动布局
方法1:
首先进入 xib 或者 Storyboard,先把 Use Autolayout 前面的勾取消
然后选中控件,按住 control 拖向背景或者 View Controller
然后会弹出一个黑色的框(处在不同位置的控件显示的内容不同):
依照英文提示便可以选择固定的位置。然后界面上便会出现如下图的标志
多了一些横条竖条。这些便表示某些控件已经使用了自动布局。
你可以点开 xib 或 Storyboard 左下角的那个小三角,里面有一项名为“Constrains” ,你可以在那边查看你的控件的自动布局情况。
方法2:
和方法1相同,先取消勾选 Use Autolayou。选中 View Controller (xib)中你希望它自动布局的控件(Label、Button、Text Field 等均可),在 Size inspector 里你可以看到"Autosizing",文字上方有两个正方形和许多个类似字母"I"的图像,如蓝色箭头所指。
在这边就可以选择固定在哪个角、哪个边,还是在中间了。
这样就完了,好像很简单,但是。。。
这种方法主要运用于一些比较特殊的情况。如本例中的三个 View,它们旋转之后你会发现布局不如像我们想象中的那样完美。视图之间的 padding 不正确。换个说法就是视图的大小不完全正确。所以我们需要写一些额外的代码。
首先先对这三个 View 在 ViewController.h 中分别创建三个输出口,命名为 topleft, topright, down:
在 ViewController.m 中添加如下方法:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
CGRect rect = self.topleft.frame;
rect.size.width = 210;
rect.size.height = 120;
self.topleft.frame = rect;
rect = self.topright.frame;
rect.origin.x = 250;
rect.size.width = 210;
rect.size.height = 120;
self.topright.frame = rect;
rect = self.down.frame;
rect.origin.y = 160;
rect.size.width = 440;
rect.size.height = 120;
self.down.frame = rect;
}
else
{
CGRect rect = self.topleft.frame;
rect.size.width = 130;
rect.size.height = 200;
self.topleft.frame = rect;
rect = self.topright.frame;
rect.origin.x = 170;
rect.size.width = 130;
rect.size.height = 200;
self.topright.frame = rect;
rect = self.down.frame;
rect.origin.y = 240;
rect.size.width = 280;
rect.size.height = 200;
self.down.frame = rect;
}
}
当视图控制器旋转到一个新的方向,这个回调将会被调用。它会监控视图控制器旋转的方向,并且适当的调整视图大小-在这种情况,根据已知 iPhone 屏幕大小会有一个 hard-code (将可变变量用一个固定值来代替的方法叫做 hard-code )偏移。这个回调会在一个动画 block 中发生,所以会动态的改变大小。
用更便捷的Autolayout
既然 Xcode 中有 Use Autolayout 这个选项,那么我们该如何使用呢?
首先可以把上面的代码都删除了。
然后同时选中上面两个 View,从 Xcode 的 Editor 菜单中选择 Pin - Widths Equally 即可。
同时我们看到 Pin 菜单下有其他选项,这些便是自动布局的其他方式。我们可以根据需要进行选择。出现如图所示的橙色标记即为已选择自动布局。
好了,现在我们点开左下角的小三角,发现了这个东西:
这个便是固定的距离。当然在 Attribute inspector 中你可以更改它的数值(Constant)。