除了写这本“Developing an iOS 7 Edge”书之外,我还针对iOS 7更新了app,所以我想我应该和大家分享一下我的收获。如果你正在面向iOS 7系统更新应用,同时你的应用还支持iOS 6,我希望我的所得能帮助到你。

 
为什么你的视图隐藏在状态栏和导航栏之下(要怎么做呢?)
如果你之前使用iOS 6 SDK开发了程序,而现在你想用iOS 7 SDK重新编译,你可能已经注意到视图的顶部隐藏在了状态栏和导航栏之下,像这样:
 
你可能会欣赏苹果在iOS 7中使用的半透明效果,状态栏和导航栏都是半透明的。真正的问题是他们改变了视图的高度--UIViewController的视图顶端是过去(不透明)状态栏的底部。如果你的应用正同时支持iOS 6和iOS 7,你该如何确定它们的高度?
  1. - (CGFloat)topOfViewOffset
  2. {
  3. CGFloat top = 0;
  4. if ([self respondsToSelector:@selector(topLayoutGuide)])
  5. {
  6. top = self.topLayoutGuide.length;
  7. }
  8. return top;
  9. }
respondsToSelector返回yes,事实上,我们可以在UIViewController上调用topLayoutGuide方法。由于topLayoutGuide对iOS 7来说是崭新的,所以我们需要做这个检查,并且如果你在iOS 6中调用,app就会崩溃。如果你以iOS 7为目标,那就不需要创建topOfViewOffset方法--你可以仅在视图控制器中调用self.topLayoutGuide.length.
 
我的应用还支持iOS 6,所以我把上述方法添加到了UIViewController上的一个类--解决了把它复制至每个单独视图控制器的麻烦。我可以在视图控制器中导入这个类别:
  1. - (void)viewDidLayoutSubviews
  2. {
  3. [super viewDidLayoutSubviews];
  4. self.textView.frame = CGRectMake(0,
  5. self.topOfViewOffset,
  6. self.textView.frame.size.width,
  7. self.textView.frame.size.height);
  8. }
文本视图的位置是我们想要的--在视图底部下方20 points(self.topOfViewOffset)处。
 
确保在viewDidLayoutSubviews中调用topOfViewOffset (或 topLayoutGuide),而不是在viewDidLoad或viewWillAppear中。在viewDidLoad和viewWillAppear中调用topLayoutGuide.length显得有点怪异,会返回大量的“0”。
 
隐藏状态栏
如果想要隐藏状态栏,你可在view controller中执行以下方法:
  1. - (BOOL)prefersStatusBarHidden
  2. {
  3. return YES;
  4. }
 修复坏掉的表视图
Headers
 iOS 7中的table view,如果使用的是分组,那么-tableView:heightForHeaderInSection不能返回0,试着切换至一个无格式的table view (UITableViewStylePlain) ,如果你不想要页眉的话。在iOS 7中,两个table views在视觉上相差无几,所以你切换至无格式表视图不会有很大不同。
 
委托和数据源
确保把table view上的委托和源数据设为0(感谢Stuart Hall指出了这一点)。
  1. - (void)dealloc
  2. {
  3. self.tableView.delegate = nil;
  4. self.tableView.dataSource = nil;
  5. }
滚动问题
我没弄清楚为什么我的table view不能像以前那样滚动至屏幕顶部。此前,我是以编程方式让table view滚动至屏幕顶部:
  1. [self.tableView setContentOffset:CGPointZero];
猜猜怎么了?它不适用于iOS 7--table view位于状态栏和导航栏下方。At least, that’s what it does if you have the contentInset set to a nonzero ‘top’ value.So here’s how to scroll a table view to the top in iOS 7 if you have a content Inset set:
  1. [self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top)
  2. animated:NO];
选择器覆盖内容
在iOS 6中,我使用的一些选择器叠加了内容,不过还好,因为iOS 6没有使用透明的背景。在iOS 7中,选择器使用了透明的背景,让用户更难以辨认选择器的值,当有东西在下边时。把选择器的背景颜色设置为白色来解决iOS 7中的问题(iOS 6中没有出现这个问题):
  1. self.datePicker.backgroundColor = [UIColor whiteColor];
如果你的选择器因为透明背景而难以辨认,那可以试试这个方法。
 
隐藏键盘
在一些view controller中,我在viewwillappear中隐藏键盘,但是这在iOS 7中行不通。所以我试着在-viewDidAppear中调用-resignFirstResponder,但是每当我在app中导航至那个屏幕时,在隐藏键盘前的瞬间我能看到键盘。原来-viewWillDisappear是一个很好的选择:
  1. - (void)viewWillDisappear:(BOOL)animated
  2. {
  3. [self.textField resignFirstResponder];
  4. }
 所以不用在viewWillAppear中隐藏键盘,试着在viewWillDisappear中隐藏。
 
文本转语音
iOS 7通过AVSpeechSynthesis API引入了文本转语音功能,使用起来也非常容易:
  1. AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
  2. AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@"Hey there!"];
  3. [synthesizer speakUtterance:utterance];
这个API中包含声音、音量以及音高等等,如果你想了解更多,可以查看文档或者获得一份Developing an iOS 7 Edge的拷贝(免责声明:我是本书的合著者,它可以帮你加快iOS 7开发)。
 
总结
在iOS 7中有许多新东西,有些内容的用法跟此前相比有了很大的变化。针对iOS 7更新应用是让我头疼的一个问题--尤其是处理半透明的状态栏和导航栏,所以希望这篇文章能帮你节省更多时间。
 

为iOS 7而开发 并支持iOS 6的更多相关文章

  1. iOS 9应用开发教程之iOS 9新特性

    iOS 9应用开发教程之iOS 9新特性 iOS 9开发概述 iOS 9是目前苹果公司用于苹果手机和苹果平板电脑的最新的操作系统.该操作系统于2015年6月8号(美国时间)被发布.本章将主要讲解iOS ...

  2. Delphi推出Delphi XE4支持IOS开发

    Delphi 新推出 Delphi XE4 ,这是一个支持 iOS 应用开发的新版本.Delphi XE4 带来 Embarcadero 全新的 ARM 编译器 下载地址

  3. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  4. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

      Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Mic ...

  5. 从C#到Objective-C,循序渐进学习苹果开发(5)--利用XCode来进行IOS的程序开发

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.前面几篇随笔主要介绍C#和O ...

  6. iOS系统提供开发环境下命令行编译工具:xcodebuild

    iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单 ...

  7. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  8. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  9. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

随机推荐

  1. bzoj2132: 圈地计划

    要分成两坨对吧.. 所以显然最小割 但是不兹辞啊.. 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来,减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 ...

  2. Unity NGUI UILabel文字变色 及相关问题

    在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...

  3. Boost.Asio c++ 网络编程翻译(20)

    异步服务端 这个图表是相当复杂的:从Boost.Asio出来你能够看到4个箭头指向on_accept.on_read,on_write和on_check_ping. 着也就意味着你永远不知道哪个异步调 ...

  4. Java读取WEB-INF目录下的properties配置文件

    如何在Java代码中读取WEB-INF目录下的properties配置文件,下文给出了一个解决方案. 我们习惯将一些配置信息写在配置文件中,比如将数据库的配置信息URL.User和Password写在 ...

  5. UVa 993: Product of digits

    这道题很简单.先将N用2,3,5,7(即10以内的素数)分解因数(需要先特殊判断N不为1),然后将可以合并的因数合并(如2*2合并成4,)这样求得的结果位数会减少,大小肯定会小一些.具体实现见代码. ...

  6. React组件的生命周期各环节运作流程

    'use strict'; React.createClass({ //1.创建阶段 getDefaultProps:function(){ //在创建类的时候被调用 console.log('get ...

  7. Git CMD - pull: Fetch from and integrate with another repository or a local branch

    命令格式 git pull [options] [<repository> [<refspec>…​]] 命令参数 -q, --quiet 安静模式. -v, --verbos ...

  8. C#中关于webconfig的读写

    近期一个小网站需要一个计数的信息 偷懒不想用别的什么方法 原本想用个xml 无奈不太会使 虽然不推荐这种方法 不过还是记下来方便日后查看 webconfig信息 <?xml version=&q ...

  9. Web通信中的Get、Post方法

    首先我们要了解Tomcat,Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. ...

  10. AndroidManifest.xml中data标签中所有属性的含义

    属性(ATTRIBUTES): android:host 这个属性用户定义URI授权的主机部分,除非给过滤器也指定了<data>元素的scheme属性,否则这个属性没有意义. 注意:在An ...