UIView UIBezierPath CGPath CAShapeLayer 等的關係

UIView UIBezierPath CGPath CAShapeLayer 等的關係

前言:推薦使用 Dash 這個軟件來查看 API 文檔,比 xcode 自帶的 API 文檔方便太多

這些東西的關係,我到如今才整明白,分享下:swift

需求:

好比,咱們須要在一個 ViewControllerview 中添加一個圓形的 UIView,如何作呢?xcode

你須要知道的

  1. UIBezierPath 能夠畫任何形狀
  2. CGPathUIBezierPath 的一個屬性,能夠從 UIBezierPath 中獲取,也就是說 UIBezierPath 是高於 CGPath 的上層模型
  3. UIView 是畫板,UIBezierPath 是畫筆,在操做的時候不是往畫板上添加東西,仍是直接在畫板上做畫
  4. 要想做畫,你須要在 UIViewdraw() 方法中用 UIBezierPath 畫畫,不能新建 UIView 對象後再添加路徑

實現步驟

1. 新起一個 BallView: UIView 類, 在 draw() 方法中實現畫畫的方法

class BallView: UIView {
    override func draw(_ rect: CGRect) {
        // 在 rect 框架中新想一個橢圓路徑,若是 rect 是方形的,這個路徑就是正圓的
        let path = UIBezierPath(ovalIn: rect)
        
        // 設置路徑的描邊寬度
        path.lineWidth = 1
        
        // 設置這個路徑的填充顏色和描邊顏色
        UIColor.orange.setFill()
        UIColor.yellow.setStroke()
        
        // 填充這個路徑,描邊這個路徑
        path.stroke()
        path.fill()
    }
}

2. 在你須要的 ViewController 中新建 BallView 對象,並添加到 view 的子 views

注意: 新建的任何 UIView 默認狀況下背景是不透明的,你須要單獨設置這個屬性值來實現背景透明 isOpaque: Bool框架

class AnimationDymanicVC: UIViewController {
   override func viewDidLoad() {
        super.viewDidLoad()
        // 在 frame 中新建一個 BallView: CGRect 能夠有多種實現方法,具體看 API
        let ballView = BallView(frame: CGRect(origin: view.center, size: CGSize(width: 60, height: 60)))
        ballView.isOpaque = false // 沒有設置這條的時候顯示是圖1那樣,設置之後是圖2那樣
        view.addSubview(ballView)
    }
}

opaque.png
notopaque.png

相關文章
相關標籤/搜索