HSStockChart:用 Swift 繪製股票分時圖、K 線圖

HSStockChart

HSStockChart 是一個繪製股票分時圖、K 線圖的庫。支持流暢的回彈拖動,長按十字線,捏合放大縮小等功能,主要使用了 CAShapeLayer 來繪圖,相比使用 Core Graphics 和重寫 drawRect 的方法更高效,佔用內存更小。git

GitHub地址:HSStockChartgithub

Features

  • 支持繪製分時圖,五日分時圖,K 線圖,MA 線指標,交易量柱等。
  • 支持橫屏查看。
  • K 線圖利用 UIScrollView 達到流暢的滑動查看效果。
  • 使用 CAShapeLayer 繪圖,內存佔用更小,效率更高。

Explain

  1. 以前繪圖的方法是重寫 drawRect 方法,在方法裏獲取 CGContext 而後利用Core Graphics 來進行繪圖,調用 setNeedsDisplay 來刷新。可是這種方法有個問題是:

一旦你實現了 CALayerDelegate 協議中的 -drawLayer:inContext: 方法或者 UIView 中的 -drawRect: 方法(其實就是前者的包裝方法),圖層就建立了一個繪製上下文,這個上下文須要的內存可從這個公式得出:圖層寬x圖層高x4字節,寬高的單位均爲像素。對於一個在 Retina iPad 上的全屏圖層來講,這個內存量就是 2048x1526x4字節,至關於12MB內存,圖層每次重繪的時候都須要從新抹掉內存而後從新分配。【摘自 iOS Core Animation- Advanced Techniques 中文譯本 高效繪圖一章】swift

由於我要達到流暢滑動查看的效果,因此在 UIScrollView 上添加了一個 UIView 這個 View 的寬度會依據當前展現數據的多少而變化,結合 UIScrollViewContentSize 就能達到很好的滑動效果。ide

若是我用以前重寫 drawRect 的方法,那麼這個 View 會根據數據量的變大而變大,從而致使繪圖內存急劇上升,數據量大的時候會崩潰。基於此,我採用了 CAShapeLayer 的方式繪圖,此方式的特色以下:動畫

CAShapeLayer 是一個經過矢量圖形而不是 bitmap 來繪製的圖層子類。你指定諸如顏色和線寬等屬性,用 CGPath 來定義想要繪製的圖形,最後就自動渲染出來了。固然,你也能夠用 Core Graphics 直接向原始的內容中繪製一個路徑,相比之下,使用 CAShapeLayer 有如下一些優勢:spa

  • 渲染快速。CAShapeLayer 使用了硬件加速,繪製同一圖形會比用 Core Graphics 快不少。
  • 高效使用內存。一個 CAShapeLayer 不須要像普通 CALayer 同樣建立一個寄宿圖形,因此不管有多大,都不會佔用太多的內存。
  • 不會被圖層邊界剪裁掉,一個 CAShapeLayer 能夠在邊界以外繪製。你的圖層路徑不會像在使用 Core Graphics 的普通 CALayer 同樣被剪裁掉。
  • 不會出現像素化。當你給 CAShapeLayer 作3D變換時,它不像一個有寄宿圖的普通圖層同樣變得像素化
  1. 自定義 CAShapeLayer,重寫 action(forKey event: String) 方法。目的是 關閉 CAShapeLayer 的隱式動畫,避免滑動時候或者十字線出現時有殘影的現象(其實是由於 Layer 的 position 屬性變化而產生的隱式動畫)3d

    class HSCAShapeLayer: CAShapeLayer {
        override func action(forKey event: String) -> CAAction? {
            return nil
        }
    }
    複製代碼

Contact

個人博客:myhanson.com
GitHub地址:HSStockChart
若是使用中發現問題歡迎添加 issue ,也歡迎 Pull request。code

相關文章
相關標籤/搜索