「我寫了一個Function幫我畫底線,有用到的View只要複製過去用就行了,利害吧!!」約翰這麼說
「這麼常用的話,何不加到View底下當成Extension就好了...」對面傳來冷冰冰的聲音
好吧,早晚要面對extension這個煩人又迷人的設計
原本只是想在 UIView 加個底線,所以寫了這樣的程式:
let border = CALayer()
border.backgroundColor = UIColor.black
border.frame = CGRect(x: 0, y: myView.frame.height, width: myView.frame.width, height: 1)
myView.layer.addSublayer(border)
很好很強大,簡單幾行搞定
然後接著下來有幾個畫面都是類似的長像
好吧~勉強複製貼上,放到updateUI也不會很麻煩
然後是下一個專案要用…
可惡…開始覺得麻煩了
只好再找找有沒有方法能省事
果然這種小問題已經有各種大神給出程式碼了,
所以新增一個檔案叫「UIView+Border.swift」 內容如下:
import Foundation
import UIKit
@objc public extension UIView {
@objc enum ViewSide : Int {
case Left, Right, Top, Bottom
}
@objc public func addBorder(toSide side: ViewSide, withColor color: CGColor, andThickness thickness: CGFloat) {
let border = CALayer()
border.backgroundColor = color
switch side {
case .Left: border.frame = CGRect(x: frame.minX, y: frame.minY, width: thickness, height: frame.height); break
case .Right: border.frame = CGRect(x: frame.maxX, y: frame.minY, width: thickness, height: frame.height); break
case .Top: border.frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: thickness); break
case .Bottom: border.frame = CGRect(x: frame.minX, y: frame.maxY, width: frame.width, height: thickness); break
}
layer.addSublayer(border)
}
}
有幾個我不太了解但有查到的說明如下:
開頭加上 @objc :因為專案是Objective-C和Swift混用,所以為了讓Objective-C的程式碼也能使用而加的
enum ViewSide >>: Int<< :原本找到的範例是沒有後面的INT,但有神人提到是Swift 3 以後需要加的所以就加上去了
public:為了要讓Internal層級可以呼叫
使用起來如下,三個參數依序是:哪一邊、顏色、粗細
self.myView.addBorder(toSide: .Bottom, withColor: UIColor.init(hex: "ff0000").cgColor, andThickness: 1)
打完收工,小菜一碟