• 为iOS 7而开发 并支持iOS 6


    除了写这本“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.     CGFloat top = 0; 
    3.     if ([self respondsToSelector:@selector(topLayoutGuide)]) 
    4.     { 
    5.         top = self.topLayoutGuide.length; 
    6.     } 
    7.     return top; 
    respondsToSelector返回yes,事实上,我们可以在UIViewController上调用topLayoutGuide方法。由于topLayoutGuide对iOS 7来说是崭新的,所以我们需要做这个检查,并且如果你在iOS 6中调用,app就会崩溃。如果你以iOS 7为目标,那就不需要创建topOfViewOffset方法--你可以仅在视图控制器中调用self.topLayoutGuide.length.
     
    我的应用还支持iOS 6,所以我把上述方法添加到了UIViewController上的一个类--解决了把它复制至每个单独视图控制器的麻烦。我可以在视图控制器中导入这个类别
    1. - (void)viewDidLayoutSubviews 
    2.     [super viewDidLayoutSubviews]; 
    3.     self.textView.frame = CGRectMake(0, 
    4.                                      self.topOfViewOffset, 
    5.                                      self.textView.frame.size.width, 
    6.                                      self.textView.frame.size.height); 
    文本视图的位置是我们想要的--在视图底部下方20 points(self.topOfViewOffset)处。
     
    确保在viewDidLayoutSubviews中调用topOfViewOffset (或 topLayoutGuide),而不是在viewDidLoad或viewWillAppear中。在viewDidLoad和viewWillAppear中调用topLayoutGuide.length显得有点怪异,会返回大量的“0”。
     
    隐藏状态栏
    如果想要隐藏状态栏,你可在view controller中执行以下方法:
    1. - (BOOL)prefersStatusBarHidden 
    2.     return YES; 
     修复坏掉的表视图
    Headers
     iOS 7中的table view,如果使用的是分组,那么-tableView:heightForHeaderInSection不能返回0,试着切换至一个无格式的table view (UITableViewStylePlain) ,如果你不想要页眉的话。在iOS 7中,两个table views在视觉上相差无几,所以你切换至无格式表视图不会有很大不同。
     
    委托和数据源
    确保把table view上的委托和源数据设为0(感谢Stuart Hall指出了这一点)
    1. - (void)dealloc 
    2.     self.tableView.delegate = nil; 
    3.     self.tableView.dataSource = nil; 
    滚动问题
    我没弄清楚为什么我的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.     [self.textField resignFirstResponder]; 
     所以不用在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更新应用是让我头疼的一个问题--尤其是处理半透明的状态栏和导航栏,所以希望这篇文章能帮你节省更多时间。
     
  • 相关阅读:
    CSS选择器
    结构体
    指针的话题
    安卓开源项目周报0208
    前端开源项目周报0207
    iOS开源项目周报0119
    安卓开源项目周报0117
    前端开源项目周报0116
    微信小程序开源项目库汇总
    iOS开源项目周报0112
  • 原文地址:https://www.cnblogs.com/ligun123/p/3435166.html
Copyright © 2020-2023  润新知