第三章 :介绍 Auto Layout

译者注:由于本人英语水平有限,尽可能描述出作者的本意。如有错误,及时指出。文中会省略部分技术无关的赘述

“Life is short. Build stuff that matters.”
                                        – Siqi Chen

Auto Layout 简介

Hello World程序好玩儿吗 ? 在我们做真正的app之前 ,我们先来看看Auto Layout

开始吧。

Auto Layout是一个基于约束的布局系统 。它允许开发人员创建自适应UI响应适当地改变的屏幕大小和设备方向。一些初学者觉得它很难学所以逃避使用它。相信我 ,只要你适应了他 , AutoLayout 将会使你最好的工具之一 ,一个你在开发app的时候离不开的工具。

你也许会奇怪 , 为什么我要讲Auto Layout 而不是直接将一个真正的项目呢 。 在Xcode 6 中 学习Auto Layout 是不可避免的 。我想要帮助你再布局用户界面上打下坚固的基础 。 随着iPhone 6 和 iPhone 6 Plus的发布 ,苹果的iPhone 也有多不同的尺寸 ,如果不适用Auto Layout,将会很难创建一个app适应不同的屏幕分辨率 。 通过这章你将学会怎样在storyboard上使用Auto Layout 。

Auto Layout 是什么

打开你的Hello World程序 ,把模拟器换成iPhone 4s 。

你得到的结果就像上图 , 按钮不在中间了 。

再试试别的, 选择 Hardware— Rotate Left .模拟器编程横屏。这次按钮也不在中间

为什么 ?出了什么问题?

首先你必须明白 , 5s 和 4s有不同的屏幕尺寸 。对5s来说 在竖屏模式下 320个点(640像素)X 568个点(1136像素 )。 4s是 320(640)X480(960).

为什么用点代替像素 ?

回到2007年,苹果推出第一代iPhone采用了3.5英寸的显示屏,
为320x480分辨率 。苹果在后面的iPhone 3G 和 iPhone 3GS 保留了这种屏幕分辨率 。在那时候1个点对应一个分辨率 。后来苹果引入iPhone 4采用了retina屏。屏幕采用640X960分辨率 。1个点对象2个像素 。

点系统使我们开发起来更轻松,不管屏幕分辨率从如何改变 。我们只处理基础分辨率 。点和像素之间的转换交给IOS去处理。

不使用Auto Layout 的时候 , 我们按钮在storyboard上得布局是固定的。换句话说我们采用hard-code的方式确定按钮的边框和位置 。在我们的例子中 ,俺就的origin 被设置为(120,269) . 因此不管你用3.5英寸还是4英寸的屏幕 ,按钮都回被画在那个特定的位置 。上图展示了按钮在不同屏幕下。这就解释了Hello World 按钮为什么不能在3.5英寸屏幕和横屏下正常显示 。

然而 , 我们想要我们的app在任何屏幕上不管横屏竖屏都能够正常的显示 , 这就是为什么我们要学习Auto Layout,它使解决屏幕适配的一个解决方案 。

Auto Layout 的所有都跟约束有关

就像前面提到的额, Auto Layout 是一个基于约束的布局系统 。允许开发人员创建的自适应UI响应适当地变化的屏幕尺寸与设备方向。听起来不错 , 但是基于约束布局是什么意思呢? 想象一些Hello World 按钮 ,如果你想把按钮放在view中间 你要怎样去描述它 。你也许会这样描述它:

不管屏幕的分辨率和方向 , 按钮都必须水平和垂直居中 。

这块实际上你需要定义两个约束 :

  • center horizontally (水平居中)

  • center vertically (垂直居中)

这些约束表达按钮在界面上得布局规则 。Auto Layout 是基于约束的 。我们以单词的形式描述约束 ,Auto Layout 以数学表达式展示出来 。比如 ,如果你定义一个按钮的位置 , 也许你想说 “左边缘要距离containing View 左边缘30个点 “,这句话可以转换位button.left = (container.left + 30). 这就是你所要知道的全部 ,幸运的是 ,我们并不需要去处理公式 。

我们看下怎样把按钮居中。

使用Auto Layout让按钮居中

Xcode 提供两种方式去使用 Auto Layout:

  • Auto Layout菜单

  • Control-drag (不太会翻译 按住control键拖动?)

我们将会再这章节中演示这两种方式 。我们先试试Auto Layout 菜单 。打开 “Main.storyboard” ,Auto Layout 菜单在Interface Builder底下 。这些按钮都是针对Auto Layout的不同功能 。

每个按钮都都自己的功能:

  • Align —— 创建对齐约束,比如对准两个views的最边缘

  • Pin —— 定义空间约束, 如定义UI空间的宽度 。

  • Issues ——解决布局问题

  • Resizing —— 调整约束影响的布局

要把Hello World 按钮居中 ,你首先应该点击Align按钮 ,在弹出来的菜单中选择 “Vertical center in container” 和 “Horizontal center in container”,然后点击 “Add 2 Constraints” 。

你现在应该看到一组约束线 。如果约束线是蓝色的。那就说明你的布局配置的么有问题约束也没有歧义 。如果你想查看你的约束,你可以在右边窗口的尺寸检查器下查看。

okay,现在你可以测试你的app了 , 点击Run运行app,改变模拟器 ,iPhone 4,iPhone 5,iPhone 6 上都可以显示正常了。

解决布局问题

我们刚刚设置的布局约束很完美 。但是不是所有的布局都这么完美 ,Xcode足够智能可以检测到任何布局问题 。

像图中一样把按钮拖到左下角 ,Xcode立马检测到布局问题 ,并且把布局线变成橙色表示错位的项目 。

布局问题经常发生在你创建了一个含糊不清的或者冲突的约束 。这里我们制定按钮水平垂直居中 ,然而 ,现在按钮却在左下角。Xcode感觉到迷惑因此用橙色的线条来表明问题 。

不管出现任何布局问题,视图的文件框都会出现一个箭头(红色或者黄色) ,点击那个箭头会出现一个问题列表 。Xcode足够只能去解决这个问题 。点击指示器按钮 会弹出一个框显示一些解决方案。针对我们这个案例 ,选择”Update Frame” 然后点击”Fix Misplacement”,按钮就会被移动到view中间 。

不是所有布局问题都是这种问题 , 我只是想掩饰怎样找到和修复问题 。当你建立一个使用自动布局你的UI无论是在自己的应用程序或
通过演练工作,你将会知道如何轻松的解决问题。

预览 storyboard

目前为止 , 我们只是使用模拟器去测试UI的变化 。虽然Xcode内置的模拟器很强大 , 但是这不是一个最好的测试UI改变的方案 。Xcode 6 提供了一个预览的功能 。

在Interface Builder下 ,打开Assistant pop-up 菜单 ,如图。
按住shift+option 不放,点击Main.storyboard 。你可以按照上图的步骤。

系统会提示你选择在哪里显示预览。如图双击右边+按钮 。

Xcode将会在你编辑用户界面的旁边显示一个预览。默认显示iPhone 4屏幕 。你可以点击左下角的+添加别的屏幕 。如果你想看横屏, 点击屏幕下得rotate按钮。预览功能对你设计用户界面非常有用 。可以让你改变用户界面的同时看到预览效果 。而且还能节省加载程序的事件,当你只是想测试一个界面的改变。

添加一个Label

现在你已经对Auto Layout有一点了解了.我们尝试在右下角添加一个Label ,iPhone 5s比iPhone 4s高 ,当你在屏幕下方添加一些UI控件 ,需要一些调整去支不同的屏幕。

在Interface Builder 中 ,从对象库中拖一个Label放在右下角,如下图 。双击并改变它的文本 “Welcome to Auto Layout” 或者其他你喜欢的文本 。

查看预览窗口 , 在3.5英寸的屏幕中找不到这个label 。

我们需要设置两个约束让它显示正常 。

我们将添加一个约束,使标签保持接近视图的底部。这次我么使用”Control-drag”d的方式去做。按住control 键不放 ,点击Label向下拖到到父视图 。然后都松开 ,这时候会弹出一个约束菜单选项 。选择”Bottom Space to Bottom Layout Guide” 来设置Lebel到试图控制器底部的约束 。这将会使Label和试图控制器底部保持一个固定的距离。这个约束一添加,Interface Builder就会显示出红色的约束线,表示有一些缺失的约束 。

解决Auto Layout问题 ,去试图文本框点击红色箭头,然后点击红色指示器 ,再点击”Add Missing constraints ”

当你预览UI或者在模拟器上运行 ,这个Label将会在3.5英寸屏或者横屏上显示正常了。

Top and Bottom 布局指南

你也许会疑惑Bottom Layout Guide是什么意思 ? 一般来说 ,Bottom Layout Guide指的是试图的底部 , 像示例中展示的那样。然而 ,还有其他情况 。有时候我们嵌入了一个Tab bar(后面章节学习 ),Bottom Layout Guide指的是Tab bar的顶部 。

对顶部而言 ,默认占了20个点(状态栏的高度),也有其他情况.如果试图包含一个Navigation Controller , guide就会设置位navigation Bar的底部 。

如果你不太明白 , 就在Interface Builder上点击”Top Layout Guide”或者”Bottom Layout Guide” ,Interface Builder 会蓝色线条展示guide线的高度

总结

本章讲解了Auto Layout的基础 。后面会通过真实的app继续探索Auto Layout其他功能 。目前为止 ,我希望你对怎样布局你的app节目和适配所有屏幕有个大概的了解 。

很多初学者(甚至一些有经验的程序员)因为Auto Layout看起来比较困惑去躲避使用它 。如果你在读完本章后开始喜欢Auto Layout 的话, 你已经在成为一个优秀IOS程序员的路上了 。最开始苹果的屏幕只有3.5英寸 ,随着苹果的发展 ,以后的app将要适配越来越多的屏幕 。所以我建议学Auto Layout。

第三章 :介绍 Auto Layout的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. amazeui模态框弹出后立马消失并刷新页面

    这篇文章主要介绍了amazeui模态框弹出后立马消失并刷新页面,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. AmazeUI 模态窗口的实现代码

    这篇文章主要介绍了AmazeUI 模态窗口的实现代码,代码简单易懂,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. ios – 在新的Storyboard中将值传递给UIViewController – Swift

    我试图将值传递给新的视图控制器–位于新的故事板文件中.但是当我这样做时,我从NewViewController得到的结果总是为零.下面是我在新故事板中显示视图控制器的方法:我尝试在这里发送信息:然后呈现视图控制器.这是我的NewViewController,我尝试接收值.但最终仍然是零.我错误地发送了这些值吗?解决方法您正在使用此行创建NewViewController的新实例而是将变量和委托分配给已从StoryBoard实例化的vc

  6. ios – 将UIViewController视图属性设置为不带有storyboard / nib的自定义UIView类

    或者上面的代码片段是推荐的吗?

  7. ios – Xcode Storyboard中“推断”和“自由形式”有什么区别?

    我有一个自定义视图,需要在所有iPhone设备上显示.在创建自定义视图XIB时,我将其称为“推断”,但它没有为iPhone6和iPhone6Plus设备调整大小.我无法弄清楚这个问题.我对“推断”和“自由形式”之间的实际差异感到困惑.有人可以解释一下这些差异吗?

  8. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  9. 在ios中将故事板从一个应用程序复制到另一个应用程序的最佳方法是什么?

    或者我在这里遗漏了什么?编辑-1我认为StoryBoard的布局大小仅限于iphone5.解决方法你这样做的方式是正确的.您只是遇到了布局约束不存在或错误的事实.关于故事板没有什么神奇之处……它只是一个像你复制到你的新项目中的任何其他文件.您应该在每个视图控制器中选择您的顶层视图,然后告诉Xcode删除所有约束并将它们重置为建议的约束,然后从那里开始.

  10. ios – Interface Builder无法确定“Main.storyboard”的类型.这可能是由于缺少SDK

    解决方法这没有你想象的那么复杂.该错误是因为您在Main.storyboard的源代码上输错了一些内容,例如我不小心在Main.storyboard的第一个打开标记之前放了一个“”.1)你必须做的是删除Main.storyboard2)转到垃圾箱,将Main.storyboard移动到桌面,用任何文本编辑器打开并修复代码;然后“全选”和“复制”.3)在Xcode上,创建一个全新的Main.storyboard,然后按右键单击文件并选择OpenAs–>源代码,然后粘贴您在剪贴板上的固定代码.4)右键单击文件

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部