UIStoryboard

难以执行的伸缩Diner
       现在,你需要对diner本身进行拉伸 - 包括背景和计数图片。

       切回更小的屏幕尺寸 然后同时选中背景和计数视图: 分别是Image View – bg_wall.png 和 Image View – bg_counter.png. 它们已经有约束了,当屏幕增大时,这些视图会被拉伸。下面我们再来选中pin图标…

111456zlh22fbw23373o36.png



       添加 Trailing Space to Superview 约束,如下图所示…

111457db0hqfuwukuu7tkf.png



       然后再点击外形切换按钮,来看看具体效果。

111458tyyn0zjz3949gryz.png


       如上图,背景图片如预期的一样被扩大了,但是图片不够大,所以被居中显示了。当程序运行在4英寸的屏幕上时,你需要修改图片,但是这里没有这样的一种机制:“针对3.5英寸屏幕使用这个图片,而针对4英寸屏幕则使用别的图片”。因此,在这里需要通过编写代码进行处理。

       在storyboard中,打开assistant view,通过control-drag counter和background UIView来创建IBoutlets,名字分别为 ibCounter 和 ibBackgroundImage.

1114597ogeozfl65416sgw.png



111500gf7z74z7m4dijij7.png



111501r641ylyrbpz2wqro.png


       接下来,在Supporting Files 群组中选择 iOSDiner-Prefix.pch 文件,并在底部的#endif 上面添加如下代码 (归功于StackOverflow):

       通过上面这行代码你可以知道程序现在是否运行在大尺寸屏幕中。代码实际上就是通过当前屏幕的尺寸,减去iPhone 5的屏幕尺寸,如果结果是0,那么说明设备是iPhone 5。

       下面在 IODViewController.m文件中使用这个宏。 将如下代码添加到viewWillAppear:最后:

       上面的代码首先检查当前程序是否运行在iPhone 5上(大屏幕);如果是的话,设置一个新的,大版本的图片。这里的图片已经存在于之前下载的starter工程中了。

       在这里,可能你要问“不应该是

吗?嗯, 不是的. 请记住UIImage会自动的添加“@2x” 来寻找针对retina的图片。因此即使你工程中包含的是

图片, 最终选择使用图片时也不需要@“2x”。

       编译并运行程序,效果如下图所示:

1115025mi5mme2e22vamj2.png


       移开点,你挤到我了!

       现在,程序有一个更大的背景了,但是右边的空间还是没有利用上。而这时,所有的东西都挤在左边了。下面就来对收银员位置重新定位一下,以利用额外的空间。

       跟之前一样,确保使用3.5英寸的外形尺寸来编辑storyboard。现在选中Bill(视图的名字是 Image View – person.png) ,并添加一个新的 Trailing Space to SuperView pin 约束.

1115035a7znsa2l2zk2ll7.png



       跟右箭头一样,Bill已经有一个Leading 约束了, 所以,如果现在切到4英寸的屏幕上,Bill将被拉伸。你知道的,Bill虽然是工作在一个快餐厅,但是他并没有那么胖!选中 Leading Space to: Image View 约束并将其删除掉。

1115048a0ua8gv8jnvza03.png




       再次切换一下外形尺寸。

111505ofuapwpupaodwddo.png



       非常棒!Bill现在被固定到右边,并利用上了更大的屏幕空间了。

111506zr0d667dhqndg6z8.png



       注意: 描述区域(如上图现在是“Hamburger”)同样被固定到右边了。但是你并没有对其进行修改呀。这是怎么发生的呢?

       这是因为这个图片被固定到文本标签上,而这个文本标签是被固定到Bill图片上的。因此当Bill的位置发生改变时,也会对描述文本控件和图片进行更新。

Auto Layout必须在iOS 6 中吗?
       现在如果你将这个iOS Diner程序运行在iPhone5.1 Simulator上,程序在启动的时候就会crash(奔溃)掉,实际上, 实际上,只要你在storyboard上开启Auto Layout,那么就会发生这个错误。这也是为什么Auto Layout必须要在iOS 6中才支持。

       对于这个程序可能不是一个大问题,因为此时大约有87%的用户已经在使用iOS 6了( are using iOS 6),但是需要知道这点。

       当你发布一个程序时,你需要决定程序将支持iOS最低的版本。针对全新的程序,你可能希望选择iOS 6,但是在本文中,是对已有的程序进行升级。如果你提高了支持的最低版本,可能当前的用户并没有升级到最新的iOS版本,那么就会遇到问题哦。

       通常,你有两个选择:

1.你可以修改工程的部署目标(deployment target),指定你的程序运行所需要的iOS版本。
2.你可以让你的程序向后兼容。

       下面我将对这两个选择都进行介绍。在本文中,你也可以只做一个,当然两个也行 — 如果你愿意的话,也可以忽略掉本节的全部内容!

修改部署目标( deployment target)
       要修改部署目标,可以这样操作:在工程导航面板中,选中 iOSDiner 工程,然后选中顶部的iOSDiner(在Project下面). 接着选择 Info 选项卡,然后将 iOS Deployment Target 修改至6.0 (最新).

1115067frqefxswxxeqofj.png



       注意,你也可以直接在Targets列表中修改iOSDiner 生成的target,如下所示:

111507vwb40vwcetyqiwcw.png


       上面两种方法的区别是target中设置的值会替代project中设置的。如果你要生成多个target以部署到不同的平台版本上,这个方法非常有用。

使程序向后兼容
       如果你希望让程序向后兼容,以支持更早的iOS版本,那么你将必须做更多的工作。如果你使用的是Storyboard(跟IOSDiner一样),那么最简单的方法就是创建2个不同的Storyboard,一个是使用Auto Layout,另外一个不使用。然后在程序启动的时候,告诉程序使用哪个Storyboard。

       现在程序被设置为启动的时候自动加载一个storyboard。这涉及到工程的Main Storyboard.

       要根据具体的iOS版本使用不同的storyboard,那么就不能在程序启动的时候自动加载一个storyboard了。要停止自动加载storyboard,可以这样操作:清除target中Summary 设置选项里面的 Main Storyboard 内容. 只需要清除当前的值就可以,如下图所示:

1115084txz2ne2jpj4ex6p.png



       接着,选中 MainStoryboard.storyboard 然后选择 FileDuplicate…. 将新的文件命名为MainStoryboard-legacy.storyboard 并将其保存。

1115098d9bpp9b6ilzo9gz.png



       现在选中 MainStoryboard-legacy.storyboard, 将显示出来的编辑器设置为更小的外观尺寸,然后取消勾选 Use Autolayout.

1115106t7y6lmqy68qqmzo.png


       现在打开 IODAppDelegate.m 文件,然后按照如下进行修改(来自 this 文章)

       将下面的代码添加到 @implementation IODAppDelegate上面:

       上面的代码定义了一个宏,当你在调用这个宏的时候,可以根据用当前设备中iOS版本跟指定的版本进行比较,以判断当前的设备版本是否比制定的版本还要新。

       用下面的代码替换application:didFinishLaunchingWithOptions:

       上面的代码会发生如下情况:

1.检查设备中运行的iOS版本。如果是最新的6.0,则加载开启了Auto Layout功能的storyboard。否则,加载没有开启Auto Layout功能的storyboard。
2.然后把storyboard创建的view controller设置给程序的window。

       现在,你针对Auto Layout处理和设备的兼容,你已经有两个很好的选择了 – 但是现在还有一个大问题。

如何利用多余出来的空间呢

       有了新的界面空间,屏幕将不在像之前那样拥挤了。 针对多出来的空间最好在美学上加强设计,而不是利用多出来的空间增加功能,如果你愿意的话,本文到现在已经完成了4英寸屏幕的匹配工作,你可以停止下来了。不过增加出来的空间你可以做什么呢?

       如何使用新增的空间呢?一般来说你有两个选择:

       首先,如果你的程序是数据驱动型(data-driven),你可以扩大视图,以显示更多的数据。在使用list或grid时,这非常游泳,比如Twitter程序。每屏中你可以添加另外的1到2个列表项。

111511bvwmpus1h3uccw9c.png



       另外一个选择就是利用额外的空间为程序增加功能。再看看Twitter程序,你可以在底部增加一个tab bar,通过这个tab bar可以访问一些经常需要访问或者难以访问到的功能。

111512om3zt9ep5rp2zy9r.png



       现在,这里有一个很好的例子 djay for iPhone.:这个例子在额外的空间中增加了功能。

       在老的3.5英寸用户界面上,开发者只能在屏幕中放置两个唱盘。用户要想访问类似查看BMP或者修改拍子速度(tempo)时,必须要修改程序的界面。

1115126r4nzdbnffxf4dri.png


       而针对新的iPhone 5,可以对程序显示的内容进行优化,一些基本的BMP信息和一个拍子速度可以全部放在一个视图中。

       类似上面这样增强用户界面功能是很棒的,但是这样会引入一个非常棘手的问题:如何设计或者升级一个已有的程序,以适配老的3.5英寸和新的4英寸屏幕呢?

       部分答案是取决于你的程序使用的是Storyboard还是.xib文件。如果都不是,而是使用代码创建UI,那么你可能需要使用类似之前IS_IPHONE5 这样的宏来获得屏幕的尺寸,然后对UI元素做出相应的调整。

       如果你使用的是Storyboard,那么让程序向后兼容是非常容易的事情 — 创建多个Storyboard,然后在代码中使用像IS_IPHONE5这样的宏来判断当前设备需要加载哪个Storyboard。

何去何从?
       恭喜! 你已经成功的将一个已经存在的程序升级到适配新的iPhone 5屏幕了,并对一些界面进行了调整,以利用上额外的空间,并为程序做了向后兼容处理,以适配早期的屏幕尺寸和iOS版本。如果现在之前的大屏幕吓到你了,那么现在你应该感觉良好啦!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值