第三十二篇、iOS 10开发
1.语音识别
苹果官方在文档中新增了API Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,speech具有以下特点:
可以实现连续的语音识别
可以对语 音文件或者语音流进行识别
最佳化自由格式的听写(可理解为多语言支持)和搜索式的字符串
官方文档:
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#import <Speech/Speech.h> //1.创建本地化标识符 NSLocale *local =[[ NSLocale alloc] initWithLocaleIdentifier: @"zh_CN" ]; //2.创建一个语音识别对象 SFSpeechRecognizer *sf =[[SFSpeechRecognizer alloc] initWithLocale:local]; //3.将bundle 中的资源文件加载出来返回一个url NSURL *url =[[ NSBundle mainBundle] URLForResource: @"游子吟.mp3" withExtension: nil ]; //4.将资源包中获取的url 传递给 request 对象 SFSpeechURLRecognitionRequest *res =[[SFSpeechURLRecognitionRequest alloc] initWithURL:url]; //5.发送一个请求 [sf recognitionTaskWithRequest:res resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { if (error!= nil ) { NSLog ( @"语音识别解析失败,%@" ,error); } else { //解析正确 NSLog ( @"---%@" ,result.bestTranscription.formattedString); } }]; |
/**
语音识别同样的需要真机进行测试 ,因为需要硬件的支持,还需要访问权限
***/
2.UITabBarController 中的改进
在iOS 10之前,tabBarItem上的文字颜色,默认是 蓝色,上面的新消息提醒数字badge 默认是红色的,未选中的TabBarItem的文字颜色默认是黑色的,我们修改的话,也只能修改它的默认颜色 ,其它的就不能进行个性化定制,使用起来非常的不方便,iOS10之后我们可以轻松个性化定制了。
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
//1.创建出三个UIViewcontroller 对象 OneViewController *oneVc =[[OneViewController alloc] init]; //2.设置每一个控制器上的tabbar oneVc.view.backgroundColor =[ UIColor redColor]; //设置标题 oneVc.tabBarItem.title = @"首页" ; TwoViewController *twovC =[[TwoViewController alloc] init]; twovC.view.backgroundColor =[ UIColor purpleColor]; //设置标题 twovC.tabBarItem.title = @"圈子" ; ThreeViewController *threVC =[[ThreeViewController alloc] init]; threVC.view.backgroundColor =[ UIColor blueColor]; //设置标题 threVC.tabBarItem.title = @"社交" ; //2.将创建好的三个普通控制器加入到tabbarController 控制器中 [ self addChildViewController:oneVc]; [ self addChildViewController:twovC]; [ self addChildViewController:threVC]; //改变tabbar 上面的文字默认颜色 oneVc.tabBarController.tabBar.tintColor =[ UIColor yellowColor]; twovC.tabBarController.tabBar.tintColor =[ UIColor yellowColor]; threVC.tabBarController.tabBar.tintColor =[ UIColor yellowColor]; //使用iOS 10新推出的 修改 tabbar 未选中的tintColor 颜色 //这一句代码将 tabbar 未选中的时候的默认色- 黑色改为红色 oneVc.tabBarController.tabBar.unselectedItemTintColor =[ UIColor redColor]; //tabbarItem 中属性 //数字提醒的颜色 在iOS 10之前的版本默认都是数字提醒都是红色 oneVc.tabBarItem.badgeColor =[ UIColor orangeColor]; oneVc.tabBarItem.badgeValue = @"90" ; //将tabBarItem 中数字提醒默认的白色改掉 使用富文本修改 [oneVc.tabBarItem setBadgeTextAttributes:@{ NSForegroundColorAttributeName :[ UIColor blackColor] } forState: UIControlStateNormal ]; |
效果图:
3.iOS10.0中字体跟随系统设置变化大小
在以前如果说我们想改变APP中程序的字体大小,我们只能自定义字体或者使用runtime进行处理,或者都得设置UIFont,非常的不妨百年,从iOS 10苹果官方允许我们自定义设置
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/* 在iOS 10当中,当咱们用户将手机的字体大小进行了设置调整之后,那么app中设置相关代码字体也会跟着一起变化 ,支持常见一些字体UI控件 比如uilabel uibutton **/ [ super viewDidLoad]; //设置字体的改变大小 self .labels.font =[ UIFont preferredFontForTextStyle: UIFontTextStyleBody ]; //允许改变 /* 苹果官方明确的告诉你必须和 preferredFontForTextStyle 或者preferredFontForTextStyle:(NSString *)style compatibleWithTraitCollection 进行结合使用 注意这里不支持模拟器操作 **/ self .labels.adjustsFontForContentSizeCategory = YES ; |
4. UIViewPropertyAnimator属性动画器
那么在iOS 10之前,我们使用UIView 做动画效果或者自定义一些layer 的动画,如果开始了,一般无法进行停止操作更不能暂停操作,而且一些非常复杂的动画处理也比较麻烦,但是在iOS10,苹果退出了一个全新的API UIViewPropertyAnimator,可供我们处理动画操作
UIViewPropertyAnimator 是 iOS 10 中新增的一个执行 View 动画的类,具有以下特点:
可中断性
可擦除
可反转性
丰富的动画时间控制功能
官方文档:
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#import "ViewController.h" @interface ViewController () @property ( nonatomic , strong ) UIView *myView; @property ( nonatomic , strong ) UIViewPropertyAnimator *myViewPro; @end @implementation ViewController - ( void )viewDidLoad { [ super viewDidLoad]; //1.创建一个View对象 UIView *Views =[[ UIView alloc] initWithFrame: CGRectMake (50, 50, 100, 100)]; Views.backgroundColor =[ UIColor yellowColor]; [ self .view addSubview:Views]; //2.创建一个外部的变量进行引用 self .myView = Views; //3.创建一个view 动画器 UIViewPropertyAnimator *viewPro =[ UIViewPropertyAnimator runningPropertyAnimatorWithDuration:1.0 delay:30.0 options: UIViewAnimationOptionCurveLinear animations:^{ //使用View动画器修改View的frame self .myView.frame = CGRectMake (230, 230, 130, 130); } completion: nil ]; self .myViewPro = viewPro; } //结束 - ( IBAction )stop:( id )sender { // YES 和NO 适用于设置当前这个属性动画器是否可以继续使用 [ self .myViewPro stopAnimation: YES ]; } //继续 - ( IBAction )continued:( id )sender { //UITimingCurveProvider /** @property(nullable, nonatomic, readonly) UICubicTimingParameters *cubicTimingParameters; @property(nullable, nonatomic, readonly) UISpringTimingParameters *springTimingParameters; **/ //设置弹簧效果 DampingRatio取值范围是 0-1 //这个取值 决定弹簧抖动效果 的大小 ,越往 0 靠近那么就越明显 UISpringTimingParameters *sp =[[ UISpringTimingParameters alloc] initWithDampingRatio:0.01]; //设置一个动画的效果 // UICubicTimingParameters *cub =[[UICubicTimingParameters alloc] initWithAnimationCurve:UIViewAnimationCurveEaseInOut]; //durationFactor 给一个默认值 1就可以 [ self .myViewPro continueAnimationWithTimingParameters:sp durationFactor:1.0]; } //暂停 - ( IBAction )puase:( id )sender { [ self .myViewPro pauseAnimation]; } //开始 - ( IBAction )start:( id )sender { [ self .myViewPro startAnimation]; } |
效果图:
5.UIColor 新增方法
在iOS10之前,UIColor中设置颜色只能通过RGB 来表示,在iOS原生还不支持#16进制写法,还得自己写分类去处理,我们知道RGB表示的颜色是优先的,而且也是不精准的,那么在iOS10中,苹果官方新增了colorWithDisplayP3Red方法
关键代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
+ ( UIColor *)colorWithDisplayP3Red:( CGFloat )displayP3Red green:( CGFloat )green blue:( CGFloat )blue alpha:( CGFloat )alpha NS_AVAILABLE_IOS ( 10 _0); |
方法可以更加精准的设置颜色了。
6.UIApplication对象中openUrl被废弃
在iOS 10.0以前的年代,我们要想使用应用程序去打开一个网页或者进行跳转,直接使用[[UIApplication sharedApplication] openURL 方法就可以了,但是在iOS 10 已经被废弃了,因为使用这种方式,处理的结果我们不能拦截到也不能获取到,对于开发是非常不利的,在iOS 10全新的退出了 [[UIApplication sharedApplication] openURL:nil options:nil completionHandler:nil];有一个成功的回调block 可以进行监视。
苹果官方解释:
1
2
3
4
5
6
|
//说明在iOS 10.0中openUrl方法已经废弃了 改为openURL:nil options:nil completionHandler:^(BOOL success /* // Options are specified in the section below for openURL options. An empty options dictionary will result in the same // behavior as the older openURL call, aside from the fact that this is asynchronous and calls the completion handler rather // than returning a result. // The completion handler is called on the main queue. |
关键代码:
1
2
3
|
[[ UIApplication sharedApplication] openURL: nil options: nil completionHandler:^( BOOL success) { }]; |
当然除了以上的这些,其它的还有很多,比如下面这些
6. SiriKit
在 iOS 10 里面开发者可以使用 Siri SDK,毫无疑问这也是 iOS 10 最重要的 SDK。从此开发者可以使用原生API提供语音搜索、语音转文字消息甚至更多常见语音功能。
7. User Notifications
这个 API 让你可以处理本地或远程的用户通知,并且可以基于某个条件,例如时间或者地理位置。这个异常强大,貌似可以拦截并替换自己 app 发下来的 payload,并且在之前版本SDK的本地通知框架已经被废弃了,在上一篇帖子有所讲到以及代码都有展示。
8.CallKit
继2014年苹果推出VoIP证书后,这次VoIP 接口的开放,以及一个全新的 App Extension,简直是VOIP的福音,可见苹果对VOIP的重视。callkit框架 VoIP应用程序集成与iPhone的用户界面,给用户一个很棒的经历。用这个框架来让用户查看和接听电话的锁屏和VoIP管理联系人电话在手机APP的收藏夹和历史的观点。
callkit还介绍了应用程序的扩展,使呼叫阻塞和来电识别。您可以创建一个应用程序扩展,可以将一个电话号码与一个名称联系起来,或者告诉系统当一个号码应该被阻止。
9.第三方键盘的改进
非常非常重要,第三方键盘一直都不能很方便的拥有长按地球键的功能,现在有了。通过 handleInputModeListFromView:withEvent: 可以弹出系统键盘列表。同时使用 documentInputMode 可以检测输入上下文中的语言,你可以对输入方式进行一些类似于对齐方式的调整。
10.iOS10 对隐私权限的管理
比如访问的摄像头、麦克风等硬件,都需要提前请求应用权限、允许后才可以使用,或者现在要提前声明,虽然以往要求不严格。在iOS10中比如遇到崩溃,日志:
崩溃日志:
***This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
你需要在info.plist文件 添加一个“NSContactsUsageDescription ”的Key,Value添加一个描述。
视频播放 需要在info.Plist中配置
官方解释:This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSAppleMusicUsageDescription key with a string value explaining to the user how the app uses this data.
访问用户的隐私数据,并且没有向用户说明,必须在plist(info.plist)中配置这个key NSAppleMusicUsageDescription 并且向用户说明.
11.Xcode7 和Xcode 8项目中的xib兼容问题
在Xcode8上打开项目要小心,尤其是对于xib过程,在变动后可不要随意点保存,否则当你回头用Xcode7打开时时发现报错了,Xcode保存的xib在xcode7上是识别不了的!
12.APPlePlay(苹果支付)
可用于 SFSafariViewController
可用于没有UI的extensions中
在 iMessage 应用中也支持 ApplePay
13.CoreData提升了并发访问性能
14.刷新控件(UIRefresh Control)
iOS系统自带的刷新控件支持所有的 UIScrollView 以及其子类,比如说 UICollectionView,UITableView。
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
// // UIRefreshControlHosting.h // UIKit // // Copyright 2016 Apple Inc. All rights reserved. // #import <Foundation/Foundation.h> @class UIRefreshControl ; NS_CLASS_AVAILABLE_IOS (10_0) @protocol UIRefreshControlHosting < NSObject > @property ( nonatomic , strong , nullable) UIRefreshControl *refreshControl __TVOS_PROHIBITED; @end |
15.GCD多线程支持创建私有队列
第三十二篇、iOS 10开发的更多相关文章
- Android UI开发第三十二篇——Creating a Navigation Drawer
Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...
- Spring Security(三十二):10. Core Services
Now that we have a high-level overview of the Spring Security architecture and its core classes, let ...
- Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输
一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...
- 第三十二篇:在SOUI2.0中像android一样使用资源
SOUI2.0之前,在SOUI中使用资源通常是直接使用这个资源的name(一个字符串)来引用.使用字符串的好处在于字符串能够表达这个资源的意义,因此使用字符串也是现代UI引擎常用的方式. 尽管直接使用 ...
- 第三十二篇 -- CreateFile、ReadFile、WriteFile
一.CreateFile 这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 函数原型: HANDLE WIN ...
- 第三十二篇-NavigationView导航抽屉的使用
效果图: 导航抽屉所用到的布局是DrawerLayout,可以在里面添加一个线性布局和TextView组件,TextView组件的文本信息就是"主页面".然后和线性布局平行添加一个 ...
- Python之路【第三十二篇】:django 分页器
Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...
- 第三十二篇 玩转数据结构——AVL树(AVL Tree)
1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...
- 第三十二篇:vue的响应式原理
好家伙 什么是响应式?比较官方的回答: Vue.js 的核心包括一套"响应式系统". "响应式",是指当数据改变后,Vue 会通知到使用该数据的代码. 例如,视 ...
随机推荐
- Android Touch事件传递机制通俗讲解
在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...
- HDU 1080 DP
匹配两个人相似度. A,G,C.T.每两个都会有一个相应的值,给出两串基因.长度能够不一样,能够在基因中间加_使两串长度一样.然后有一个相应值.求最大相应值. 先做出相应的表 DP方程: x=dp[i ...
- material-dialogs
https://github.com/afollestad/material-dialogs
- Nagios在Ubuntu server上的安装配置
首先我参看的是Nagios的官方文档,Nagios – Installing Nagios Core From Source——The Industry Standard in IT Infrastr ...
- [Angular 2] @Input & @Output Event with ref
The application is simple, to build a color picker: When click the rect box, it will check the color ...
- C语言默认參数值的实现
from http://blog.csdn.net/pipisorry/article/details/25437893 C语言中没有參数默认值的概念,能够利用宏来模拟參数默认值: (对于有多个參数的 ...
- Debian 7 升级内核
Debian 7(wheezy)的内核是3.2,要想把内核升级到3.16怎么办呢?使用backports源! 一.添加backports源 打开/etc/apt/source.list文件,加入以下: ...
- 产品设计原则之移动APP【转】
随着移动互联网的发展,越来越多的Web产品开始布局移动端,因此最近经常碰到PM们在交流讨论移动APP产品的设计.我从事移动互联网已经有一年多了,通过不断的学习和实践也积累了一些心得,今天整理并分享一下 ...
- Django单元测试二三事
零.前言 之前做过一个微信公众平台的开发者后台,功能比较简单,我个人也比较懒,所以就没有写测试.前段时间更新了一下版本,对代码进行了改动.结果昨天收到消息说后台出问题了,一个功能无法使用.我检查了半天 ...
- struts2拦截器源码分析
前面博客我们介绍了开发struts2应用程序的基本流程(开发一个struts2的实例),通过前面我们知道了struts2实现请求转发和配置文件加载都是拦截器进行的操作,这也就是为什么我们要在web.x ...