首页 > 代码库 > 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
设置位dynamic为真意味着物理引擎将不再控制这个怪兽的运动,由我们自己写好相关运动代码。
将categoryBitMask设置为之前定义好的monsterCategory。
contactTestBitMask表示与什么类型对象碰撞时,应该通知contact代理。
collisionBitMask表示物理引擎需要处理的碰撞事件。
pipeUp.physicsBody = SKPhysicsBody(rectangleOfSize: pipeUp.size)pipeUp.physicsBody.dynamic = falsepipeUp.physicsBody.categoryBitMask = pipeCategorypipeUp.physicsBody.contactTestBitMask = birdCategory
pipeUp.physicsBody.collisionBitMask = worldCategory | pipeCategory