AsyncDisplayKit 系列教程 —— 集成、示例

集成

集成 AsyncDisplayKit 非常简单,使用 CocoaPods 添加 pod "AsyncDisplayKit" 然后 pod update 就可以了。什么?你还不愿意使用 CocoaPods?那你手动集成好了。

AsyncDisplayKit 只支持 iOS7.0 版本以上的系统,如果你使用的是 Swift,那么还需要将头文件引用 #import <AsyncDisplayKit/AsyncDisplayKit.h> 添加到 Swift-Bridging.h 中。

以下教程均使用 Swift 演示代码,Objective-C 使用方法也是类似的。

Hello, World!

一个 Demo 就应该从 ** Hello, World! ** 开始。

在 ViewController.swift 中添加以下代码

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let textLabel = ASTextNode()
        textLabel.attributedString = NSAttributedString(string: "Hello, World!",
            attributes: [
                NSForegroundColorAttributeName: UIColor.blackColor(),
                NSFontAttributeName: UIFont.systemFontOfSize(17)
            ])
        textLabel.frame = CGRect(x: 50, y: 50, width: 100, height: 20)
        self.view.addSubnode(textLabel)
    }

}

我们做了些什么?

  1. 创建了一个ASTextNode的实例,名为textLabel;
  2. 为textLabel添加了一串富文本文字,并设定一些富文本属性,这里要注意,AsyncDisplayKit只支持富文本文字;
  3. 粗略地为textLabel设定一个frame;
  4. 把textLabel添加到view中。

整个过程其实和 UIView 的初始化并且 addSubview 没有太大的区别。 现在,你可以把 Demo Run 起来看看效果了。

控件对应关系

在 AsyncDisplayKit 的世界里,常用的 UIKit 控件都有对应的 AS 控件,以下是一个对照表。

UIKit AsyncDisplayKit
UIView ASDisplayNode
UILabel ASTextNode
UIImageView ASImageNode
UIButton ASButtonNode
UITableView ASTableView
UICollectionView ASCollectionView
UITableViewCell ASCellNode
UICollectionViewCell ASCellNode

ASDisplayNode 是所有控件的基类,它是整个 AsyncDisplayKit 界面库的核心,ASDisplayNode 不仅可以承载 AsyncDisplayKit 预定义的控件(例如 ASTextNode),也可以承载 UIKit 控件(例如 UISlider)。

使用Block方法返回 UIView 就可以承载 UIKit 控件

let slider = ASDisplayNode { () -> UIView! in
    return UISlider()
}

Measure ASTextNode

还记得刚刚我们只是粗略地设置了一下 textLabel.frame 吗?我们当然是希望textLabel中的文字有多大,它的frame就有多大。

在AsyncDisplayKit的世界中,我们不需要使用 NSAttributedString.boundingRectWithSize去计算ASTextNode的宽高。

我们使用以下方法去计算文本的宽高。

textLabel.measure(CGSize(width: view.bounds.width, height: CGFloat.max))
textLabel.frame = CGRect(x: 0, y: 50, width: textLabel.calculatedSize.width, height: textLabel.calculatedSize.height)

给定measure方法一个CGSize的参数,该参数定义了textLabel的最大宽度和最大高度,使用textLabel.calculatedSize获取计算好的宽高。

你会在后续的教程中知道,measure的强大之处。

ASImageNode

ASImageNode 是 UIImageView 的极佳替代品,ASImageNode 会在后台线程渲染好 UIImage ,然后再在主线程中呈现图像。 因此,ASImageNode可以极大地提升FPS数值。

如果是本地图像,你可以直接将一个 UIImage 实例赋值到 ASImageNode.image 中。

如果是网络图像,你应该使用 ASNetworkImageNode, 同时你需要为 ASNetworkImageNode 指定一个 ImageManager 用于管理网络请求、图像缓存等操作,一般搭配 SDWebImage 使用,你可以将以下的代码直接拷贝使用。

class ImageManager: NSObject, ASImageDownloaderProtocol, ASImageCacheProtocol {
    
    static let sharedManager = ImageManager()
    
    func fetchCachedImageWithURL(URL: NSURL!, callbackQueue: dispatch_queue_t!, completion: ((CGImage!) -> Void)!) {
        SDWebImageManager.sharedManager().cachedImageExistsForURL(URL) { (existed) -> Void in
            if existed {
                SDWebImageManager.sharedManager().downloadImageWithURL(URL, options: [], progress: nil, completed: { (cachedImage, _, _, _, _) -> Void in
                    dispatch_async(callbackQueue, { () -> Void in
                        if let image = cachedImage {
                            if let cImage = image.CGImage {
                                dispatch_async(callbackQueue, { () -> Void in
                                    completion(cImage)
                                })
                                return
                            }
                        }
                        completion(nil)
                    })
                })
            }
            else {
                dispatch_async(callbackQueue, { () -> Void in
                    completion(nil)
                })
            }
        }
    }
    
    func downloadImageWithURL(URL: NSURL!, callbackQueue: dispatch_queue_t!, downloadProgressBlock: ((CGFloat) -> Void)!, completion: ((CGImage!, NSError!) -> Void)!) -> AnyObject! {
        print(URL)
        let operation = SDWebImageDownloader.sharedDownloader().downloadImageWithURL(URL, options: [], progress: nil) { (image, data, error, _) -> Void in
            if let image = image {
                if let cImage = image.CGImage {
                    dispatch_async(callbackQueue, { () -> Void in
                        completion(cImage, error)
                    })
                    return
                }
            }
            completion(nil, error)
        }
        return operation
    }
    
    func cancelImageDownloadForIdentifier(downloadIdentifier: AnyObject!) {
        if let downloadIdentifier = downloadIdentifier as? SDWebImageOperation {
            downloadIdentifier.cancel()
        }
    }
    
}

添加一个 imageView 到 View 中。

let imageView = ASNetworkImageNode(cache: ImageManager.sharedManager,
    downloader: ImageManager.sharedManager)
imageView.frame = CGRect(x: 0, y: 100, width: view.bounds.size.width, height: 300)
imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true
imageView.URL = NSURL(string: "http://ww3.sinaimg.cn/large/7191b2ebgw1eyb1uontv4j21w02iou0r.jpg")!
self.view.addSubnode(imageView)

ASControlNode

ASImageNode、ASButtonNode、ASTextNode 同为 ASControlNode 子类,可以直接使用 .addTarget(self, action: "handleXXX", forControlEvents: .TouchUpInside) 为它们添加点击响应事件,而避免使用addGesture等方法。

结语

关于其它控件的使用方法,需要你自己去学习使用,此遍教程的Demo代码,你可以到这里下载 https://github.com/PonyCui/AsyncDisplayKit-Issue-2

下一篇教程,将指导你完成一个 ASTableView 的编写。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,945评论 4 60
  • 嗯哼嗯哼蹦擦擦~~~ 转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 ...
    philiha阅读 4,796评论 0 6
  • 徐艺泉阅读 320评论 0 0
  • 写在前头 身为一个JS学渣,每天都在冥思苦想怎么变成一个大师,在看到“学一门后端语言,有助于进阶Js水平”这类话后...
    叶猜阅读 1,468评论 1 1
  • 今天面试有感而发。 工作了好些年,被人面试过,也面试过别人,从最开始的忐忐忑忑,到现在的波澜不惊,自己愈发活得像根...
    IT晴天阅读 514评论 9 4