2017-07-04 3 views
2

ich eine benutzerdefinierte UIView haben und ich füge hinzu, es zu meinem Viewcontroller wie folgt aus:hinzufügen UIView Rundungslogik innerhalb UIView Klasse

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

ich um die Ecken der Ansicht. Aber ich frage mich, gibt es eine Möglichkeit, diese Logik des Rundens der Ecken innerhalb der MyCustomView-Klasse zu verschieben?

+0

wo Ihr ruft dies sind .. – Dhiru

+0

Hey @BlueBoy, willkommen zu Stackoverflow. Wenn Sie einen Moment haben, um eine der Antworten als akzeptiert zu markieren, wäre das großartig. – Moshe

Antwort

4

Wie Sie IB zu verwenden, können Sie finden es bequemer, eine Verlängerung der 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 
     } 
    } 
} 

Dann können Sie diese Werte von Attributen Inspektor festgelegt zu machen.

enter image description here

+0

Tolle Lösung :) –

+0

Ich kann wirklich nicht sehen, warum dies eine gute Lösung ist. Sie stellen diese Eigenschaften jeder einzelnen UIView-Klasse zur Verfügung, während sich die Frage nach einer bestimmten Unterklasse erkundigte. Ich könnte mir vorstellen, dass dies das Laden eines Storyboards erheblich verlangsamen würde. – Leon

+0

@Leon "beträchtlich" klingt ein bisschen schwer. Ich habe gesagt, dass "wenn Sie IB" und "für die Bequemlichkeit" verwenden. Ich stimme auch mit dem Overhead überein. – Lawliet

2

Ja - Wenn Sie eine Spitze mit einer benutzerdefinierten Ansicht geladen, wird diese Spitze sehr wahrscheinlich in einer anderen Klasse verweisen. Wenn das der Fall ist, können Sie die Logik innerhalb der Klasse selbst verschieben.

A screenshot illustrating Xcode's Interface Builder

Das heißt, ich mag Lawliet's suggestion mit IBInspectable Eigenschaften eine UIView Erweiterung zu machen. Der Nachteil dieses Ansatzes besteht darin, dass jede einzelne Ansicht nun diese Eigenschaften aufweist, was einen gewissen Overhead und das Potenzial für Kollisionen schafft.

+0

ja, zweite, dass – Lawliet

0

Sie können in Ihrer UIView Unterklasse so etwas tun:

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 
    } 

} 

Auch wenn Sie einen benutzerdefinierten Wert anstelle von ‚10‘ in der corner Eigenschaft übergeben möchten, können Sie versuchen, eine Bequemlichkeit init durch zu implementieren Suche hier:

Override Init method of UIView in Swift

+0

das ist, was ich suche, aber 'fatal error: init (coder :) wurde nicht implementiert, wenn ich es ausführen – BlueBoy

+0

versuchen, dies in Init-Coder-Funktion hinzuzufügen super.init (coder: aDecoder) – Rishabh

+0

stoppt den Absturz, hat aber keine Wirkung. – BlueBoy

Verwandte Themen