可以更好的结局屏幕方向和兼容iphone和ipad的解决方案。

iOS6有一个新的技术auto layout来帮助解决这个问题。这个技术不仅可以支持app不同尺寸下的开发,而且你也不需要为每一种语言创建nib文件或者storyboards。

The problem with springs and struts

你很熟悉autosizing masks,这就是熟知的“springs and struts”模式。autosizing mask决定了当superview大小发生改变时,view会发生什么。例如,当一个view有可变宽度时,如果superview变宽,那么他也会变宽。如果有一个固定的右间距,view的右间距会同superview的右边距保持一致。

创建新的工程StrutsProblem,打开Main.storyboard,在File inspector中去掉Use Autolayout的选项。去掉后storyboard就会用旧的struts-and-springs模式了。

注意:任何使用Xcode 4.5或者更好的创建的新的nib或者storyboard文件默认会开启auto layout选项。这个功能是ios 6及以上版本才有的特性。如果你想用最新的Xcode创建兼容ios5的app,那么你就需要在每一个nib或者storyboard文件中disable这个auto layout选项。通过不选择Use Autolayout复选框。

拖拉三个不同的view到main storyboard中去。

iPhone Retina 4-inch simulator上运行。旋转后变成如下的图:

实际上你期望的是如下的结果:

左上角的图参数修改,这样会将view固定到左上角的位置,当superview改变大小时,这个view的水平和垂直方向的大小都会改变。

右上角的图参数修改

下方的图参数修改

再次运行后效果如下:

有改善但是padding内边距不对。原因是autosizing masks告知views当superview改变大小的时候他们也要改变大小,但是却没有说明到底改变多少。

为了解决这些问题,你需要在springs and struts模式下通过code来实现。比如你可以通过复写viewWillLayoutSubviews来改变那些需要重新改变大小的控件。

ViewController.m

先不要运行app,需要首先还原autosizing masks对于之前三个view的设置,否者会和上面方法起冲突。但是不同尺寸的iphone起到的效果不同,因为上面的事针对4-inch iphone的,如果换成3.5的就会有问题了,因为上面同时也是硬编码。也可以通过相对位置来设定位置可以实现,但是如果ui很复杂那么无疑这是非常耗费时间的。

Beginning Auto Layout Tutorial in iOS 7: Part 1的更多相关文章

  1. Beginning Auto Layout Tutorial in iOS 7: Part 3

    How Auto Layout works 在使用auto layout之前,你可能总是使用initWithFrame或者frame, bounds or center属性. 使用约束的好处在于你不需 ...

  2. Beginning Auto Layout Tutorial in iOS 7: Part 6

    Gallery example 屏幕有四个分开的相同的矩形,每个矩形有一个label和一个image view.创建一个Gallery的项目.在Main.storyboard中,拖拉一个view大小为 ...

  3. Beginning Auto Layout Tutorial in iOS 7: Part 4

    A little runtime excursion 为两个button都添加同一个ibaction方法在viewcontroller.m中实现如下的方法:

  4. Beginning Auto Layout Tutorial in iOS 7: Part 2

    Auto Layout to the rescue! 接下来就看看如何使用Auto Layout来实现这个效果. 首先移除viewWillLayoutSubviews方法,选择Main.storybo ...

  5. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  6. iOS布局之Auto Layout

    学习资源: <iOS6核心编程>自动布局部分 <iOS6范例经典>自动布局部分 Tutorial: iOS 6 Auto Layout versus Springs and S ...

  7. How to Use Auto Layout in XCode 6 for iOS 7 and 8 Development

    The Auto Layout is available on the Storyboard for iOS or OS X development since XCode 5. But, I did ...

  8. iOS Programming Auto Layout: Programmatic Constraints 自动布局:通过编程限制

    iOS Programming  Auto Layout: Programmatic Constraints  1.  However, if your views are created in co ...

  9. 【转】使用 Auto Layout 的典型痛点和技巧

    layoutIfNeeded()强制立刻更新布局 原文网址:http://www.jianshu.com/p/0f031606e5f2 官方文档:Auto Layout Guide 加上去年WWDC上 ...

随机推荐

  1. luogu3195 [HNOI2008]玩具装箱TOY

    懒得写 #include <iostream> #include <cstdio> using namespace std; typedef long long longliv ...

  2. 如何解决Jmeter导出的聚合报告是乱码易位问题

    在使用Jmeter这个工具的时候,有些单词不懂是什么意思,就切换到这个工具自带的中文语言: 当我们测试完毕,导出聚合报告(Summary Report)的时候: 1.有一些第一个Title下面的中文是 ...

  3. Visual C++ 连连看游戏源代码

    点击下载

  4. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  5. js获取触发事件的元素

    //获取事件 var e = window.event; //获取元素 obj = e.target || e.srcElement; console.log(e); checkRepeat(e.ta ...

  6. 第五篇:python基础_5

    本篇内容 协程函数 递归 二分法 import语句 from...import语句 模块搜索路径 包的导入 软件开发规范 logging模块的使用 一. 协程函数 1.定义 协程函数就是使用了yiel ...

  7. docker 集群 flannel网络构建

    先保证集群状态是正常的 集群管理 kubelet 在创建pod 时会先下载一个pause 镜像,这个镜像用于容器基础网络管理非常重要: 每个node 节点都要执行该操作: iptables -P FO ...

  8. openssl RSA 内存读取密钥

    主要注意一下密钥的格式 #include <openssl/pem.h> #include <openssl/err.h> bool CEncipher::CreatePubK ...

  9. 转:mysql 索引

    转:mysql 索引 文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的 ...

  10. 神奇的矩阵(bzoj 2396)

    Description 给出三个行数和列数均为N的矩阵A.B.C,判断A*B=C是否成立. Input 题目可能包含若干组数据.    对于每组数据,第一行一个数N,接下来给出三个N*N的矩阵,依次为 ...