​      用户需要以最简单的方式与应用界面进行交互。应该从用户的角度出发设计页面,使得界面更高效、简捷和直接。

storyboard以图形化的方式帮助你设计和实现界面。在设计和实现界面的过程中,你可以准确的看到你实现的界面是什么样的,界面上哪些东西合适,哪些东西不合适,以及你对界面随时的调整,都是一目了然的。

当你使用storyboard构建界面时,正如你在上一节教程中学习的那样,你一直都在与视图(View)打交道,视图(View)用于把内容显示给用户。视图(View)是用于构建用户界面,用于有效地、优雅地、清晰地展示内容的基本单元。如果你正在开发更为复杂的应用,那你可以使用多个场景和多个View。

视图层次结构

屏幕上,视图不会显示自己,也不会响应用户的输入,它们只能提供一个用于放置其它视图的窗口。于是,应用里的视图是由被称为视图层次结构的东东所管理的。视图层次结构定义了相对于其它视图的视图布局。在一个层次结构中,被包含在其它视图里的视图被叫做子视图,包含其它视图的视图被叫做父视图。即使一个视图里有多个子视图,它也只有且仅有一个父视图。

视图层次结构的顶层对象是window对象。它是UIWindow类的实例,它是屏幕上用于添加视图对象的基本容器。为了显示内容,你需要给window添加内容视图对象(内容视图对象作为window的子视图)。

内容视图和它的子视图对于用户来说,是可见的,内容视图也必须被插入到window的视图层次结构中。在你使用storyboard时,放置内容视图的位置已经为你自动配置好了。在应用被启动时,应用对象会加载storyboard,会创建有关的视图控制器类的实例,解压每个视图控制器里的视图层次,然后把作为开始的视图控制里的视图内容添加到window中。在下面的章节中,你会学习到如何管理视图控制器。现在,你需要把焦点聚集到如何在storyboard的单视图控制器中创建一个层次结构。

视图的类型

在你设计应用时,了解哪种意图下使用哪种视图是非常重要的。例如,如果你想收集用户的信息(比如是一段文本),你可以使用text field,如果你要显示一段静态的文字,你应该使用label。应用绘制时,使用UIKit框架的视图是比较容易创建的,这是因为你可以使用它们快速的装配出基本的界面来。一个UIKit框架的视图对象是UIView类或子类的实例。UIKit框架提供了不同类型的视图用于帮助你表现和组织数据。

尽管每个视图都有它自己特定的功能,但是总的来说,UIKit视图可以被归为这么几种类型:

视图类型 意图 举例

Content

显示特定类型的内容,例如图片或文本 Image view,label

Collections

显示集合或一组视图 Collection view,table view

Controls

执行动作或显示信息 Button,slider,switch

Bars

导航或执行动作 Toolbar,navigation bar,tab bar

input

接收用户的文本输入 search bar,text view

Containers

为其它视图提供容器 View,scroll view
Modal 中断应用正常的流程来让用户执行动作 Action sheet,alert view

你可以在Interface Builder中,用可视化的方式来装配视图。Interface Builder中提供了标准的view、control等库,这些东东在你构建界面时用得到。从这个库中拖出对象,把它们放置于画布中,然后用你自己的方式去安排它们。在保存之前,使用inspector来配置这些对象。你会马上看到结果,不需要写任何一行代码,你就可以运行程序了。

UIKit框架提供了标准的视图来显示各种类型的内容,你还可以继承UIView(或它的子类)来创建自己的视图。自定义的视图一定是UIView的子类,在自定义视图中,你需要自己处理所有的绘制事件,处理所有的事件句柄。在该教程中,你不会使用自定义视图,如果你有兴趣,你可以在Defining a Custom View一文中学习到如何实现自定义视图的更多知识。

使用storyboard放置视图

    在可视化环境中,使用storyboard来放置自己的视图层次。storyboard提供了一个直接地、可视化地方式来让你操作视图,构建界面。

正如你在上一节教程中看到的那样,storyboard由场景组成,每个场景都关联着一个视图层次结构。从对象库中拖出一个视图并把它摆放在场景上,storyboard就会自动把它加入到当前场景的视图层次结构中。在视图层次结构中,视图的位置是由你决定的,你把视图放到哪里,它就在哪里显示。在你给场景添加完一个视图后,你可以在画布上对视图进行重设大小、配置、移动位置等操作。

画布上也可以显示界面上对象的视图大纲,它在画布的左边显示,你从大纲上就可以清楚的看到画布中对象的层次结构。

storyboard场景中创建的视图层次结构实际上是一系列被压缩的Objective-C对象。在运行时,这些对象被解压。解压的结果就是,你使用utility区域的inspector为相关类的实例设置的属性值的层次结构被展现出来。

正如你在上一节教程中学到的那样,在storyboard中,你工作的默认界面配置被应用为界面的各个版本。当你需要为特定的设备尺寸和方向调整你的界面时,你应该把这种变化指定给特定的尺寸类。尺寸类是在显示环境下,描述水平或垂直空间的高级方式,例如竖向的iPhone或横向的iPad。有两种类型的尺寸类:普通地、紧凑地。展示环境的特点是一对尺寸类,一个描述了水平空间,一个描述了垂直空间。在画布上,你可以使用尺寸类控制器,为普通尺寸和紧凑尺寸的结合来预览和编辑界面。

在本教程中,你没有在特定的尺寸下工作,但是,如果你对尺寸类很好奇,请阅读Size Classes Design Help章节。

使用Inspector来配置视图

utility区域,对象库上方的inspector面板中显示的内容如下:

每个inspector的元素都为界面上的元素提供了重要的配置选项。当你选择了一个对象(例如一个视图),inspector会根据你选择的对象,更新面板里的属性,你就可以对属性进行设置了。

1. File:指定storyboard的一般通用信息。

2. Quick Help:获取该对象相关的有用信息。

3. Identity:为该对象指定自定义的类,定义它可访问的属性。

4. Attributes:自定义对象的可视化属性。

5. Size:指定对象的尺寸和Auto Layout属性。

6. Connections:在界面和源码之间创建连接。

在前一节教程中,你使用了Attributes inspector。在教程剩下的部分中,你会继续使用其它的inspector来配置视图和对象。尤其是,使用Attributes inspector来配置视图,使用Identity inspector来创建视图控制器,使用Connections inspector在视图和视图控制器之间创建连接。

使用Auto Layout定位视图

   当你在storyboard中开始定位视图时,你需要考虑各种各样的情况。IOS应用运行在数量众多的不同设备上,这些设备的屏幕尺寸不同,方向不同,语言不同等等。你需要动态的界面,当设备的屏幕尺寸、方向、本地化、度量等发生变化时,界面应该可以无缝的响应。

如果你已经学习了上一节教程,你会看到,Xcode提供了名为Auto Layout的工具来帮助你创建通用的、适配性强的界面。Auto Layout是解释视图之间关系的系统。在单个视图上或多个视图之间,它会让你定义一系列的约定。

点击画布右下方的Auto Layout图标,来给画布上的视图添加不同类型的约定,解决布局问题,检查用于约束行为的约定。

1.Align:创建行或列的约束。例如把一个视图放置于容器的中间,或者把一个视图放于某两个视图的左边。

2.Pin:创建空间约束。例如定义视图的高度,或者指定它离另外一个视图的水平距离。

3.Resolve Auto Layout Issues:基于建议,通过添加或重设约束来解决布局问题。

4.Resizing Behavior:指定大小重新设定后如何影响约束。

此时,对于在ToDoList应用中你创建的简单页面来说,你不需要学习Auto Layout中进一步的知识。因为,应用的界面很复杂,你就需要添加不同的约束来精确的指定,在不同的设备和方向下,界面应该如果摆放视图。在教程的最后,会有一个指向Auto Layout教程的链接,这个教程会帮助你使用约束来定义更为复杂的自适应的界面。

(译)Getting Started——1.2.2 Desinging a User Interface(设计用户界面)的更多相关文章

  1. [译]深入 NGINX: 为性能和扩展所做之设计

    来自:http://ifeve.com/inside-nginx-how-we-designed-for-performance-scale/ 这篇文章写了nginx的设计,写的很仔细全面, 同时里面 ...

  2. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  3. 浅析 - 提高xib(Interface Builder)高效工作的几个小技巧

    本文译自:8 Tips for working effectively with Interface Builder(需FQ)先来看看目录:介绍使view的Size与view中的Content相适应按 ...

  4. 【最后一篇API译文】Android开发-API指南- Contacts Provider

    Contacts Provider 今年加入了某字幕组,加之杂事颇多,许久未添新文了,惭愧之极. 在听闻 Google 即将重返中国后,近日忽又发现官方网站正在放出 API 中文版,比如本文.当然不是 ...

  5. [HIS] HIT行业常用名词及缩写定义

    [HIS] HIT行业常用名词及缩写定义 1.   EHR 居民个人电子健康记录 2.   MPI 居民个人主索引 3.   HIS 医院管理信息系统 4.   CIS 医院临床信息系统 5.   P ...

  6. DBA词典:数据库设计常用词汇中英文对照表

    1. Access method(访问方法):此步骤包括从文件中存储和检索记录. 2. Alias(别名):某属性的另一个名字.在SQL中,可以用别名替换表名. 3. Alternate keys(备 ...

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

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

  8. 大家一起来找茬(BUG)

    大家一起来找茬(BUG) ----------目录---------- 一.上手体验 1.主界面 2.功能 二.程序的 BUG 三.必应词典的 BUG 1."每日一句"里的句子不能 ...

  9. 摘自知乎--mysql

    允许晚辈叫一声前辈.从前辈的描述中可以看出前辈对MySQL已经有很好的理解,但我还是想从我这个半知半解的晚辈角度提出几点. 1.系统学习数据库,最要紧的是把基本功打牢,所以<数据库系统概念 原书 ...

随机推荐

  1. jQuery-实现全选与反选

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. ElasticSearch reindex报错:the final mapping would have more than 1 type

    ElasticSearch reindex报错:the final mapping would have more than 1 type 学习了:https://blog.csdn.net/qq_2 ...

  3. java 过滤器补充

    多个Filter按照在配置文件中配置的filter顺序执行. 在web.xml文件中配置该Filter,使用init-param元素为该Filter配置参数,init-param可接受如下两个子元素: ...

  4. ExportAsFixedFormat Visio文件另存为其他几种格式的处理

    Visio文件另存为其他几种格式的处理,以及另存为Web文件等相关操作. 1.Visio导出为PDF格式 在一般情况下,PDF格式是较为常用的内容格式,因此Visio文档(Vsd格式)导出为PDF也是 ...

  5. Netty利用ChannelGroup广播消息

    在Netty中提供了ChannelGroup接口,该接口继承Set接口,因此可以通过ChannelGroup可管理服务器端所有的连接的Channel,然后对所有的连接Channel广播消息. Serv ...

  6. 说说C#之父——安德斯·海尔斯伯格

    安德斯·海尔斯伯格(Anders Hejlsberg,1960.12~),丹麦人,Turbo Pascal编译器的主要作者,Delphi和.NET之父! 看到照片的那一刹那儿,我就觉得帅爆了,53岁的 ...

  7. UIWebView捕获内部web点击事件

    在此有一个webView默认是打开 百度的页面:设置代理,并在代理中处理 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest ...

  8. CCF-201512-3 绘图

    问题描写叙述 用 ASCII 字符来绘图是一件有趣的事情.并形成了一门被称为 ASCII Art 的艺术.比如,下图是用 ASCII 字符画出来的 CSPRO 字样. .._._.._.._-_.. ...

  9. LR学习笔记之—参数和变量

    一.LR中参数的使用 LR中参数默认使用“{}”来表示,如果想要修改,可以再General Options/Parameterization设置参数的边界字符 经常用到的函数: lr_save_str ...

  10. VUE 内置指令

    1.v-if v-else-if v-else <!DOCTYPE html> <html lang="zh"> <head> <meta ...