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 UIKit
import WebKit

class 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 = false
pipeUp.physicsBody.categoryBitMask = pipeCategory
pipeUp.physicsBody.contactTestBitMask = birdCategory
pipeUp.physicsBody.collisionBitMask = worldCategory | pipeCategory

 

 

 

iOS 8 新给我们带来了什么,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。