首页 > 代码库 > iOS 8 新给我们带来了什么
iOS 8 新给我们带来了什么
苹果WWDC2014大会公布了许多关于iOS8的激动人心的更新,包括iCloudDrive、OSXYosemite与iOS8的协作、iBook共享机制、Quick Type预测输入、Swift编程语言、iOS8向上兼容等等亮点,本文重点从针对开发者的新功能API进行介绍。
- 现在,开发者可以用苹果官方给出的方法实现实时的「毛玻璃」效果了(UIVisualEffect Class Reference)。在此之前,虽然很多 App 使用了「毛玻璃」效果,不过都不是通过苹果官方给的方法实现的。如果希望在 iOS 上实现「毛玻璃」效果,只能用两种很蛋疼的办法(1. 用类似 GPUImage 这样的图像处理库实时截屏、做高斯模糊、调整亮度、饱和度;2.将视图底色设置为透明,在视图底下放一个 UIToolBar)
- OS X 和 iOS 联动功能(handoff)的 API 是开放的(微信、QQ、Word 等应用也可以获得类似系统内信息应用、Pages 等与 Mac 联动的功能)
- Universal App 中, iPhone、iPad 界面可以同时存储在一个 StoryBoard 文件里(这是要为大屏 iPhone 做准备的节奏吗?)。
- 导航栏 (UINavigationBar)现在可以通过手势压缩(类似 Safari 那样向上滑动压缩导航栏,向下滑动展开导航栏)。做阅读类应用可以减少很多工作量。
- 原先的警告对话框(UIAlertView)和动作列表(UIActionSheet)被合并成了一个 UIAlertController,并且可以加上文本框(UITextField)。
- 分隔视图(UISplitViewController,类似 iPad 里的设置 App 那样左右两边分开的视图)现在支持 iPhone(原先仅在 iPad 上可用)
- 这次iOS支持完整的MIDI了,可以加载sf2/dls格式的音色库、有了MidiSynth支持、有了完整的Midi CC控制、支持SysEx信息。有了专门播放Midi的类:AVMIDIPlayer。音频处理方面,添加了混响、滤波、重采样、变调、优质3D音效(比如说HRTF)等等。
另外,新加入的 Extensions 特性只支持:
- 分享(如安装微信后,其他的 App 不用做设置,通过统一的系统接口,即可将内容分享到朋友圈)
- 动作(应该是可以把自定义动作(UIActivity)和复制、打印、加入到阅读列表这些一并放在 UIActivityView 里,在整个系统层面)
- 今日(应该是在通知中心里的 widget 那些)
- 照片编辑(比如提供第三方滤镜等等)
- 存储文件(比如以后 Adobe Reader 里的 PDF 可以用 iBooks 打开了)
- 自定义键盘(第三方输入法等等)
一、Swift
http://practicalswift.com/2014/06/14/the-swift-standard-library-list-of-built-in-functions/
二、WEB开发者的福音
作为一位WEB前端工作者,先看一下新的WebKit,从此苹果开发者可以更好的用HTML+JS开发iPhone应用了。
不再要用 UIWebView,也不要用 Interface Builder,WKWebView直接作为视图view
首先,创建一个 Single View Application 软件。然后加入 WebKit.framework(Build Phases->Link Binary With Libraries)。
在你的 ViewController 中,可以开始使用 WKWebView 了。在 loadView 函数里把 view 设定成 WKWebView,在 viewDidLoad() 里就可以直接连去网站了(做法和 UIWebView 一样)。
import UIKitimport WebKitclass ViewController: UIViewController { var webView: WKWebView? = WKWebView() override func loadView() { super.loadView() view = webView } override func viewDidLoad() { super.viewDidLoad() webView!.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.apple.com"))) }}
三、Sprite Kit框架的改进
在WWDC2014上,Sprite Kit又有了很多新的提升!其中一个很有意思的东西就是Physics Field!也就是物理场!这意味着我们在Sprite kit上编写虚拟物理场的游戏将变得非常简单!
在viewDidLoad函数里对SKview做一些初始化操作,添加从GameScene.sks文件读取的SKScene的presentScene到一个SKView
override func viewDidLoad() { super.viewDidLoad() if let scene = SKScene.unarchiveFromFile("GameScene") as? SKScene {
// Configure the view. let skView = self.view as SKView skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill skView.presentScene(scene) } }
创建一个新的类继承SKScene并重载其方法
class SKScene : SKEffectNode { init(size: CGSize) class func sceneWithSize(size: CGSize) -> Self! var size: CGSize var scaleMode: SKSceneScaleMode var backgroundColor: UIColor! var delegate: SKSceneDelegate! var anchorPoint: CGPoint var physicsWorld: SKPhysicsWorld! { get } func convertPointFromView(point: CGPoint) -> CGPoint func convertPointToView(point: CGPoint) -> CGPoint var view: SKView! { get } func update(currentTime: NSTimeInterval) func didEvaluateActions() func didSimulatePhysics() func didApplyConstriants() func didFinishUpdate() func didMoveToView(view: SKView!) // 函数在Scene被present到SKView后立即执行,我们可以在这里对Scene做一些初始化 func willMoveFromView(view: SKView!) func didChangeSize(oldSize: CGSize)}
重写了touchesBegan:withEvent函数,即点击屏幕便开始按SKAction序列播放动画模仿地面移动效果。
SKAction提供给我们一个animateWithTextures函数,我们可以很轻松地实现Sprite的一个动作动画。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let moveGroundSprite = SKAction.moveByX(-groundTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.02 * groundTexture.size().width * 2.0))
let resetGroundSprite = SKAction.moveByX(groundTexture.size().width * 2.0, y: 0, duration: 0.0)
let moveGroundSpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveGroundSprite,resetGroundSprite]))
}
可以直接使用图片名称为Sprite添加texture,也可以创建一个SKTexture,然后将创建好的texture添加给Sprite。区别在于,渲染图片是否在创建SKSpriteNode前还是当时。
SKTexture类,也是一个很重要的类,我们用它来创建Sprite所需要的texture,可以直接用图片名称创建texture,创建后的texture可以重复使用,Sprite的动画执行可以通过一系列的texture切换来实现,这里再强调一下preLoad,这对整个程序的效率有很大的提高作用,作为开发者,我们肯定知道我们时候需要用到哪些Sprite,在这之前我们就可以先完成这些图片的渲染,当我们需要的时候可以直接拿来用,这可以帮我们省去部分时间,让程序更加顺畅。不再使用的texture会被内存释放掉。
另外,当我们有很多texture的时候, 我们可以把所有的texture拼接成一个texture Atlas,cocos2d中,可以利用texturePacker制作Atlas,并生成plist文件,在Sprite Kit中也可以根据Atlas图片和plist文件,Sprite Kit自动渲染Atlas里面的所有texture,然后我们根据对应的名字取得texture使用,而且可以重复使用,这对内存优化也起到很大作用。
Sprite Kit的物理场Physics Field一共有十个:
self.physicsWorld.gravity = CGVectorMake( 0.0, -5.0 ) self.physicsWorld.contactDelegate = self
pipeUp.physicsBody = SKPhysicsBody(rectangleOfSize: pipeUp.size)pipeUp.physicsBody.dynamic = falsepipeUp.physicsBody.categoryBitMask = pipeCategorypipeUp.physicsBody.contactTestBitMask = birdCategory
pipeUp.physicsBody.collisionBitMask = worldCategory | pipeCategory