2017-07-04 78 views
2

裏面我有一個自定義的UIView,我把它添加到我的ViewController是這樣的:添加UIView的舍入邏輯的UIView

let myCustomView = Bundle.main.loadNibNamed("MyCustomView", owner: nil, options: nil) as! MyCustomView 
myCustomView.layer.cornerRadius = 10 
myCustomView.layer.masksToBounds = true 

我圓視圖的角落。但是我想知道,是否有辦法移動這個在MyCustomView類中四捨五入的邏輯?

+0

哪裏是你調用這個.. – Dhiru

+0

嘿@BlueBoy,歡迎StackOverflow上。如果您有時間將其中一個答案標記爲已接受,那就太好了。 – Moshe

回答

4

當您使用IB,你可能會發現更方便地使UIView

extension UIView { 
    @IBInspectable var borderColor: UIColor? { 
     set { 
      layer.borderColor = newValue?.cgColor 
     } 
     get { 
      if let color = layer.borderColor { 
       return UIColor(cgColor:color) 
      } else { 
       return nil 
      } 
     } 
    } 

    @IBInspectable var borderWidth: CGFloat { 
     set { 
      layer.borderWidth = newValue 
     } 
     get { 
      return layer.borderWidth 
     } 
    } 

    @IBInspectable var cornerRadius: CGFloat { 
     set { 
      layer.cornerRadius = newValue 
      clipsToBounds = newValue > 0 
     } 
     get { 
      return layer.cornerRadius 
     } 
    } 
} 

的擴展,然後你可以設置從屬性檢查器中的值。

enter image description here

+0

真棒解決方案:) –

+0

我真的不明白爲什麼這被認爲是一個很好的解決方案。你將這些屬性公開給每一個UIView類,而問題是詢問一個特定的子類。我想這會大大減緩故事板的加載速度。 – Leon

+0

@Leon「相當」聽起來有點沉重。我已經說過「如果你使用IB」和「爲了方便」。我也同意指出的開銷。 – Lawliet

2

是 - 如果你加載筆尖與自定義視圖,即筆尖很可能指的另一個類。如果是這樣的話,你可以在類內部移動邏輯。

A screenshot illustrating Xcode's Interface Builder

這麼說,我真的很喜歡做一個UIView擴展與IBInspectable性能Lawliet's suggestion。這種方法的缺點是每一個觀點現在都有這些屬性,這會產生一定的開銷和潛在的衝突。

+0

是的,第二 – Lawliet

0

,你可以做你的UIView子類是這樣的:如果你想在cornerRadius屬性傳遞自定義值,而不是「10」

class RoundedView: UIView { 

    /* 
    // Only override draw() if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func draw(_ rect: CGRect) { 
     // Drawing code 
    } 
    */ 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.layer.cornerRadius = 10 
     self.layer.masksToBounds = true 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.layer.cornerRadius = 10 
     self.layer.masksToBounds = true 
    } 

} 

此外,您還可以嘗試通過實現方便的init尋找這裏:

Override Init method of UIView in Swift

+0

這是我正在尋找,但得到'致命的錯誤:初始化(編碼器:)還沒有執行「,當我運行它 – BlueBoy

+0

嘗試添加此初始編碼器功能 super.init(編碼器: aDecoder) – Rishabh

+0

,它可以阻止崩潰,但不起作用。 – BlueBoy