2015-12-10 11 views
17

Ich versuche, 5 separate UIStackViews in meinem ViewController Grenzen geben. Ich gab jedem von ihnen eine IBOutlet und rief sie dann in viewDidLoad an, um die layer Eigenschaft zu benutzen, aber ohne Erfolg. Ist es nicht möglich, Stapelansichten programmatisch zu begrenzen?Können Sie UIStackView-Rahmen geben?

Code:

@IBOutlet weak var stackView1: UIStackView! 
@IBOutlet weak var stackView2: UIStackView! 
@IBOutlet weak var stackView3: UIStackView! 
@IBOutlet weak var stackView4: UIStackView! 
@IBOutlet weak var stackView5: UIStackView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    stackView1.layer.borderWidth = 5 
    stackView2.layer.borderWidth = 5 
    stackView3.layer.borderWidth = 5 
    stackView4.layer.borderWidth = 5 
    stackView5.layer.borderWidth = 5 
} 

Antwort

18

Leider kann dies nicht geschehen. UIStackView ist insofern ungewöhnlich, als es sich um eine "nicht rendernde" Ansicht handelt, die das Layout ausführt (mit Auto-Layout-Einschränkungen), aber nicht selbst angezeigt wird. Es hat eine Ebene wie alle UIViews, aber es wird ignoriert.

Siehe the Apple doc unter "Verwalten der Stapelansicht des Appearance":

Die UIStackView ist eine nonrendering Unterklasse von UIView. Es stellt keine eigene Benutzeroberfläche zur Verfügung. Stattdessen verwaltet es nur die Position und Größe seiner angeordneten Ansichten. Daher haben einige Eigenschaften (wie backgroundColor) keine Auswirkungen auf die Stapelansicht. In ähnlicher Weise können Sie nicht außer Kraft setzen layerClass, drawRect :, oder drawLayer: InContext:

+0

Was, wie eine Grenze addieren es ist kniffliger, kann es nicht einfach so machen. Sie müssten eine andere Ansicht hinzufügen und Layoutbeschränkungen verwenden. Versuchen Sie, eine Frage mit Code zu stellen, wenn sie nicht erfolgreich ist! – Clafou

10

Es ist möglich, dies zu tun, indem sie die Grenzen seinen Blick in dem Stapelansicht mit. Dies kann eine Menge Arbeit sein und es kann bestimmte Situationen geben, die entweder nicht funktionieren oder umgangen werden müssen, so dass es sich möglicherweise nicht lohnt. Sie müssen die Stack-Ansichten verschachteln, damit Sie Rahmen sowohl in horizontaler als auch in vertikaler Richtung bereitstellen können. In meiner Bordered Stack Views blog post gehe ich näher darauf ein. Aber im Grunde habe ich bei normalen Ansichten einen Hintergrund, der auf die Farbe meiner Wahl eingestellt ist, und gebe Beschränkungen für Höhe oder Breite von 1 ein, abhängig von der Richtung der Achse der Stapelansicht. Hier ist die vollständige Hierarchie eines 2x2 Raster in Interface Builder gebaut:

view hierarchy

in diesem Ergebnis Resultierende:

enter image description here

Here's a link to my github repo dieses Beispiels, so dass Sie die Storyboard-Datei sehen können.

+0

Ups Ich machte einen Tippfehler, [fest] ( –

+0

) coole Spitze bro! arbeitete wie ein Charme –

6

Sie können stackView in eine UIView einbetten und anschließend die Grenzen dieser Ansicht (Farbe, Breite usw.) festlegen und dann die stapView -Ansicht auf diese UIView wie oben, links, rechts, Höhe.

0

Hier ist ein handliches Stück Code gefunden und Verwendung:

extension UIView { 
    func addTopBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.cgColor 
     border.frame = CGRect(x:0,y: 0, width:self.frame.size.width, height:width) 
     self.layer.addSublayer(border) 
    } 

    func addRightBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.cgColor 
     border.frame = CGRect(x: self.frame.size.width - width,y: 0, width:width, height:self.frame.size.height) 
     self.layer.addSublayer(border) 
    } 

    func addBottomBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.cgColor 
     border.frame = CGRect(x:0, y:self.frame.size.height - width, width:self.frame.size.width, height:width) 
     self.layer.addSublayer(border) 
    } 

    func addLeftBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.cgColor 
     border.frame = CGRect(x:0, y:0, width:width, height:self.frame.size.height) 
     self.layer.addSublayer(border) 
    } 

    func addMiddleBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.cgColor 
     border.frame = CGRect(x:self.frame.size.width/2, y:0, width:width, height:self.frame.size.height) 
     self.layer.addSublayer(border) 
    } 
} 

einfach auf einer beliebigen Ansicht wie folgt verwenden:

bottomControls.addMiddleBorderWithColor(color: buttonBorderColor, width: 3.0) 

Quelle: How to add only a TOP border on a UIButton?

Verwandte Themen