可以更好的结局屏幕方向和兼容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. vrpie在Visio Studio 中无法调试的问题

    最近这这几天一直在研究vrpie,之前不能调试,一调试就出问题,打开那个生成的htm文件是没问题的,最初的解决方法是不通过调试来打可那个htm页面,但是这样比较麻烦,因为经常需要和服务器交互,就只能用 ...

  2. loj2055 「TJOI / HEOI2016」排序

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  3. Hotspot GC实现原理

    GC扫描 可达性分析的GC Roots主要是全局性引用或在Stack Frame中 ,现在的应用仅仅方法区往往就有几百兆,这样要这个检查这里面的引用,就必然会消耗很多时间,效率很低. 分析工作在一个保 ...

  4. IOS开发---菜鸟学习之路--(六)-UITableView几个方法的使用说明

    对于UITableView的基础使用我这边就不做重复介绍了 我重点就来介绍下如何实现大部分新闻的界面.也就是第一条记录显示大图片下面加一段文字说明 然后剩下来的内容全部显示为文字图片的格式 其实要做到 ...

  5. python中subprocess.Popen的args和shell参数的使用

    subprocess模块定义了一个类: Popen class subprocess.Popen( args,        bufsize=0,        executable=None,    ...

  6. 工作中用到的安卓日志相关命令(logcat)

    1. 打印安卓日志,在cmd中使用adb shell logcat:在adb shell下直接打logcat 2. 如果不想打印占用终端,则加个&号,即logcat & 3. 如果想把 ...

  7. Python面向对象之私有方法(4)

    类里面有很多成员修饰符,用来修饰各种属性 (1)私有属性,只有内部的方法可以访问 class Foo: xo = 'xo'#表明是公共的,内部外部都可以访问 __ox = '私有属性'#私有属性,只有 ...

  8. EasyUi DataGrid 获取选中行的checkbox

    EasyUi DataGrid 获取选中行的checkbox var checked = $(":checkbox[name=ID]:checked"); console.log( ...

  9. Linux系统——常见的系统调用

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  10. Codeforces Round #364 (Div. 2) B 标记

    B. Cells Not Under Attack time limit per test 2 seconds memory limit per test 256 megabytes input st ...