【转】iOS 9 Storyboard 教程(一上)
转自:http://blog.csdn.net/yangmeng13930719363/article/details/49886547
Storyboard是在iOS5之后新增的一个令人兴奋的功能,使用Storyboard可以节省很多的时间来构建你的app界面.
为了向你介绍什么是Storyboard,我会以一张图片为例.下面这张图就是你在本教程中使用Storyboard完成的一个app.
你也许还不是十分了解这个app是做什么的,但是你可以清楚的看到它哪些界面,以及这些界面关系.
你可以在Storyboard看到所有的ViewController的布局,并且可以描述它们之间的联系.使用Storyboard中,你可以更好的理解在app中所有的界面.
- Storyboard可以描述在多个场景之间的过渡(transitions).这些过渡被称作”segues”.在Storyboard,你可以通过正确的连接你的ViewController来创建这些segues.感谢segues!你只需要很少的代码管理你的UI.
- Storyboard可以让tableView与基本的cell和静态cell的工作更容易.你几乎可以完全在Storyboard中设计你的tableView,这样就减少了大量的代码.
- Storyboard可以让Auto Layout更加容易,使用Auto Layout允许你在元素之间的数学关系,确定这些元素之间的位置关系.这个强大的工具可以让你更容易操作不同尺寸和大小的设备.在这个教程中你将使用Auto Layout,但是关于Auto Layout的知识在不在本教程的范围之内,不过你可以在Auto Layout Tutorial或者watch the video series了解更多关于Auto Layout的内容.
在这篇Storyboard教程中,你将会创建一个简单地app,允许你创建一个玩家和游戏以及他们技能的列表,在学习的过程中,你将学会在一些最常见的任务中使用Storyboard.
让我们开始吧!
打开Xcode,接着创建一个新的工程,选择 Single View Application.如下图:
之后Xcode会创建这个项目,Xcode的主窗口如下图:
新的项目包含两个类, AppDelegate.Swift 和 ViewController.swift,以及本教程的关键:Main.storyboard文件.
这个app仅支持竖屏,所以需要在General->Deployment Info -> Device Orientation取消Landscape Left和Landscape Right选项.
现在让我们看一看Storyboard.在项目导航栏里点击Main.storyboard,之后会在 Interface Builder编辑器里看到Storyboard.
一个viewController的的storyboard官方术语是”场景(scene)”,你可以使用这个术语.所谓场景(scene)就是一个控制器在storyboard中的显示.
你可以看到包含一个空view的简单viewController.在storyboard,左边的箭头指向一个ViewController,这个箭头代表这个ViewController是一个初始控制器.
在storyboard编辑器中,你可以从右下角Object Library中拖拽出一些控件来为你的ViewController设计布局.你会看到仅仅一瞬间就完成了,它是多么神奇啊!
Note:
你可能会注意到在storyboard中,默认的控制器是正方形的.Xcode7可以为这些默认控制器设置Auto Layout和Size Classes.Auto Layout和Size Classes允许你灵活地改变用户界面的尺寸,这对于有许多尺寸的iPhone和iPad来说是非常有用的.为了能够学到更多关于size classes的内容,查看Adaptive Layout video tutorial series,在本课程中,你会把可选的步骤场景在你的storyboard中,这样你就可以更容易的看到最终屏幕上的样子.
在你探索之前,调整模拟场景为iPhone6/6s.
在Document Outline选择 View Controller .如果你没有看到Document Outline,点击storyboard中左下角的这个按钮:
在Attributes Inspector底下的Simulated Metrics(模拟度量)属性,改变Size为iPhone 4.7 inch,如图:
在storyboard中,这个尺寸是iPhone6/6s的屏幕尺寸.
在storyboard中,“inferred”是Simulated Metrics里默认的设置.Simulated Metrics是一个在storyboard中的视觉辅助设计,也就是你的屏幕最终的样子.仅仅需要记住的是,它们不会在运行时被使用.
为了体会storyboard是如何工作的,可以在右下角控制器面板的Object Library中拖拽一些控件:
当你拖拽这些控件的时候,它们会出现在左侧的 Document Outline 中:
storyboard中显示了你创建的所有控制器,目前仅仅有一个view controller (或者是scene)在你的storyboard中,但是在本教程中你会加入其他几个控制器.在这个场景之上有,一个微型版的Document Outline,称作Dock.
在这个场景中,Dock显示了顶层的对象,每一个场景都拥有至少一个View Controller 对象, 一个 First Responder 对象, 和一个 Exit 选项,但是它也可能拥有其他顶级的对象.Dock可以很方便的连接这些outlet和action.如果你想要连接其他的view controller,你可以很简单地从Dock中拖拽它的图标.
Note:
你可能不太想使用First Responder.它是一个代理对象,指的是任何对象在任何给定的时间内的第一响应状态.举一个例子,你可以把按钮的Touch Up Inside事件连接到First Responder的selector上.如果在某个时候,一个文本框是输入的焦点,然后你可以按下按钮来让作为第一响应者的文本字段拷贝到粘贴板.
运行这个app,它应该看起来和你在编辑器里设计的完全一样(你的可能看上去不同于下面的截图—这仅仅是为了演示,不会在以后的教程中使用):
你定义的这个 View Controller作为初始的控制器—但是app怎样才能加载它呢?看一看应用程序的代理就可以找到答案.打开AppDelegate.swift你会看到源代码从这里开始.
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
return true
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
在AppDelegate这个类的指定文件的头部,@UIApplicationMain属性作为模块的入口点.这个属性使用storyboard所必须的.你的应用程序委托继承自UIResponder,并且他还有一个UIWindow属性.所有的方法都是空的.甚至是application(_:didFinishLaunchingWithOptions:) 也只是简单地返回了true.
这个秘密在一个叫做info.plist的文件中.在导航栏里点击 Info.plist 你将看到下面这些内容:
Storyboard app使用的这个键UIMainStoryboardFile,也被称为”storyboard file base name”,为了能够指定Storyboard的名称,必须在加载被命名的storyboard文件,自动地从storyboard中实例化”Initial View Controller”,然后把控制器的view添加到一个新的UIWindow对象上. 你也可以在General tab里Deployment Info下地Project Settings里看到这个部分:
现在来创建一个包含几个view controller的Ratings app吧~
仅仅把它添加到我的标签里
你将要创建的Ratings app有一个TabBarController,并且跟着两个item,使用storyboard非常容易创建.
你将会在一个空的storyboard上开始创建,所以切换回Main.storyboard ,然后删除默认创建的view controller.这可以通过在Document Outline 点击View Controller 然后按下delete键,就可以删除了.
为了方便,再一次改变Simulated Metrics让其作为一个iPhone来显示这个场景.当你做之前,在Document Outline选中Tab Bar Controller,然后在右侧的 Attributes Inspector ,改变 Size 为iPhone 4.7 inch.这两个view controller也会跟着改变,大小都变为 iPhone 6/6s的尺寸.
这个新的 Tab Bar Controller 已经预配置好了两个view controller.UITabBarController也被称作Container view控制器,因为它包含了一个或者更多其他的视图控制器.其他两个常用的容器是Navigation Controller 和Split View Controller(在后面你将使用的是Navigation Controller).
容器之间的关系是由Tab Bar Controller 和 view controller 的箭头代表的.下图看到的在箭头中间的图标代表特定的嵌入关系.
Note:
如果你想同时移动或缩小Tab Bar Controller和它的附加视图控制器,你可以按住⌘-点击或点击和拖拽多个选中的场景.这才有可能使他们在一起.(选中的场景有一条蓝色的轮廓.)
往第一个view controller(当前显示的标题是”Item 1”)中拖拽一个UILabel,双击,然后设置这个label的标题为”First Tab”.然后也拖拽一个UILabel在第二个view controller(“Item 2”),设置这个label的标题为”Second Tab”.当你在这两个控制器之间接切换时确实看到发生了某些变化.
Note:
当你缩小编辑器的时候,你是不能往这些控制器里拖拽控件的.你可以通过双击这个工作区间来返回到正常缩放尺寸.
编译并且运行(Build & Run),之后你会在控制台里看到类似下面的错误信息:
Ratings[18955:1293100] Failed to instantiate the default view controller for UIMainStoryboardFile ‘Main’ - perhaps the designated entry point is not set?
幸运地是,错误信息非常清楚 — 你从来就没有设置一个入口点,也就是说在你删除默认创建的控制器之后,你并没有设置Initial View Controller.为了解决这个问题,选中Tab Bar Controller然后在右侧的 Attributes Inspector 里勾选 Is Initial View Controller.
在工作区间里,这个箭头之前指向被删除的view controller ,现在指向的是这个Tab Bar Controller.
这就意味着,当你运行app的时候,UIApplication会让Tab Bar Controller 作为主屏幕.运行app尝试一下.这个app现在有一个tab bar,并且你可以在两个two view controller之间进行切换:
Tip:
想要改变 initial view controller,你也可以在view controller之间拖拽这个箭头.
Xcode附带了构建一个带标签app的模板(也叫标签应用模板),你可以使用这个模板,但是它却不能很好地知道这应该如何工作,所以如果你觉得有必要,你也可以手动创建一个Tab Bar Controller.
Note:
如果你的Tab Bar Controller连接了超过5个子控制器,当你运行app的时候,他会自动地把这些控制器都加上.多么简洁啊!
添加一个Table View Controller
目前只有两个UIViewController连接到了 Tab Bar Controller上.现在,你需要用一个UITableViewController来替换第一个UIViewController.
在Document Outline栏里点击第一个view controller ,然后按delete键删除.然后从Object Library中拖拽出一个新的Table View Controller到先前view controller的位置.
现在你需要把这个Table View Controller放在一个导航控制器里.在Table View Controller选中情况下,再Xcode的菜单栏里选择Editor\Embed In\Navigation Controller .这也就添加了另一个控制器.
你也可能会从Object Library拖拽一个已经嵌入tableview 的Navigation Controller,并且这个个嵌入命令也能节省很多时间.
因为这个Navigation Controller 也是view controller的容器(就好像Tab Bar Controller),它有一个关系指向Table View Controller.你也可以在看见Document Outlin里看到这个关系.
可以注意到的是Table View Controller已经嵌入到了一个导航栏里.Interface Builder会自动把它放在那里,因为这个控制器将显示在这个Navigation Controller的框架里.那并不是一个真正的UINavigationBar对象,但它是一个模拟的对象.Simulated Metrics将在这个控制器里推断上下文,然后在Navigation Controller会显示一个导航栏.在一个 Tab Bar Controller里会显示一个标签栏,等等…
新的控制器是正方形的.当你把它们嵌入到 Tab Bar Controller ,一瞬间,它们就会改变它们的大小里匹配它们的父视图控制器.
为了把这两个新的控制器连接到Tab Bar Controller,按住control并且拖动Tab Bar Controller到Navigation Controller上.当你放首位的时候,会出现一个小的.选择Relationship Segue – view controllers选项:
这样在这两个控制器之间就创建了一个新的箭头关系.这也是一个嵌入关系,正如你看到的 Tab Bar Controller.
Tab Bar Controller有两个嵌入的关系,对应每一个标签.这个Navigation Controller本身也与Table View Controller有一个嵌入关系.
当你创建了这个新连接的时候,这个Tab Bar Controller就添加了一个新的标签.并且有一个简单地名字为”Item”.对于这个app来说,如果你想让这个新的控制器作为第一个标签,那么你只可以拖动来改变的它们的顺序.
尝试运行一下这个app.现在第一个导航控制器里的标签包含了一个 table view.
只要你把一个view controller连接到了Tab Bar Controller上,你就可以在Document Outline或者这个控制器的底部看到生成了一个Tab Bar Item对象.你可以在Tab Bar Controller上使用Tab Bar Item来配置标签的标题和图标.
选中 Navigation Controller里的Tab Bar Item,之后在Attributes inspector里设置标题为Players.
用相同的方式给view controller的Tab Bar Item重命名为Gestures.一个精心设计的app也应该在这些标签上放一些图片, 教程的资源包含了一个为images的子文件夹.拖拽这个文件夹到工程中的 Assets.xcassets文 里.
你可能猜到了,给Gestures项的是Gestures.png.
一个内嵌在Navigation Controller中view controller有一个Navigation Item,用来配置导航栏(navigation bar).在Document Outline离选择Table View Controller的Navigation Item然后在Attributes inspector中改变它的标题为Players.
注意到了么?现在在Document Outline里的Item已经变为了Players啦~
另外,你也可以双击导航栏然后改变标题.需要注意的是,你应该双击Table View Controller中的模拟导航栏,而不是在Navigation Controller里真正的导航栏对象.
运行app,你就会惊叹于你的漂亮的标签栏,然而却没有写一行代码!
【转】iOS 9 Storyboard 教程(一上)的更多相关文章
- 【iOS】史上最全的iOS持续集成教程 (上)
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面
iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main. ...
- Swift语言Storyboard教程:第一部分
更新记录: 该Storyboard教程由Caroline Begbie更新iOS 8和Swift相关内容.原文作者为教程编纂组的成员Matthijs Hollemans. 2014/12/10更新: ...
- Swift Swift语言Storyboard教程:第二部
本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Stor ...
- iOS 11开发教程(十三)iOS11应用编辑界面添加视图
iOS 11开发教程(十三)iOS11应用编辑界面添加视图 在iOS中添加视图的方式有两种:一种是使用编辑界面添加视图:另一种是使用代码添加视图.以下是这两个方式的详细介绍. 1.编辑界面添加视图 使 ...
- Swift语言Storyboard教程:第二部
本文由CocoaChina翻译小组@TurtleFromMars翻译自raywenderlich,原文:Storyboards Tutorial in Swift: Part 2 更新记录:该Stor ...
- iOS开发入门教程
iOS开发入门教程 http://my.oschina.net/mailzwj/blog/133273 摘要 iOS开发入门教程,从创建项目到运行项目,包括OC基础,调试,模拟器设置等相关知识. iO ...
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
blog.csdn.net/totogo2010/article/details/8205810 目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...
- 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上)
[转] 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上) jquery的功能总是那么的强大,用他可以开发任何web和移动框架,在浏览器市场,他一直是占有重要的份额,今天,就给大家 ...
随机推荐
- 通过ssh远程ipython notebook登录使用服务器
远程服务器有时候我们这里通过虚拟机登录服务器的winclient会发生冲突,怎么办呢?曲线救国,使用SSH登录. 首先在远程机器上,启动IPython notebooks服务: remote_user ...
- 使用JsonConfig控制JSON lib序列化
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作.JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格 ...
- php中for循环的应用
for 循环是 PHP 中最复杂的循环结构.它的行为和 C 语言的相似.在PHP中使用的是执行相同的代码集的次数. for 循环的语法是: for (expr1; expr2; expr3)state ...
- Spring切面编程步骤
什么是面向切面编程 面向对象的编程主要注重核心业务,而面向切面编程主要关注一些不是核心的业务,但又是必须的辅助功能,比如一个完整的系统中,记录平时系统运行时抛出的异常,需要我们去记录,以便我们对系统尽 ...
- protobuf 系列 ---------下载、编译与使用
protobuf是谷歌开发并开源的二进制序列化工具,比常用的xml,json体积更小,解析速度更快. 目前,手头上的项目有涉及到这个工具,打算仔细研究一番,顺带记录遇到的问题,解决方法,时间足够的话, ...
- java集合(1)- 类底层数据结构分析
Java 集合类图 参考:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html
- WebApi2 文件图片上传下载
Asp.Net Framework webapi2 文件上传与下载 前端界面采用Ajax的方式执行 一.项目结构 1.App_Start配置了跨域访问,以免请求时候因跨域问题不能提交.具体的跨域配置方 ...
- sparklyr包:实现Spark与R的接口
日前,Rstudio公司发布了sparklyr包.该包具有以下几个功能: 实现R与Spark的连接—sparklyr包提供了一个完整的dplyr后端 筛选并聚合Spark数据集,接着在R中实现分析与可 ...
- cas4.2.7与shiro进行整合
准备工作 cas单点登录开始前准备,请参考cas4.2.7实现单点登录. 与shiro进行整合 注:准备工作的基础上,对cas客户端进行如下改进. 引入相关jar包 shiro-cas-1.2.6.j ...
- Detailed Information for Outputted Files from Somatic Mutation Annotators(annovar 注释文件条目详细解释)
CONTENTS *_annoTable.txt (ANNOVAR) *_annoTable.txt (SnpEff) *_genelist.txt (ANNOVAR & SnpEff) db ...