2015-12-10 12 views
17

Sto provando a fornire 5 distinti UIStackViews nei miei bordi ViewController. Ho dato a ciascuno uno IBOutlet e li ho chiamati in viewDidLoad per utilizzare la proprietà layer ma senza risultato. Non è possibile fornire bordi di viste dello stack, in modo programmatico?Puoi fornire i bordi di UIStackView?

Codice:

@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 
} 

risposta

18

Purtroppo questo non può essere fatto. UIStackView è insolito in quanto è una vista "non rendering" che esegue il layout (utilizzando i vincoli di Layout automatico) ma non viene visualizzata. Ha un livello come tutti gli UIViews, ma è ignorato.

Vedi the Apple doc in "Gestione del Stack vista Aspetto":

L'UIStackView è una sottoclasse di UIView nonrendering. non fornisce alcuna interfaccia utente propria. Invece, gestisce solo la posizione e le dimensioni delle sue viste organizzate. Di conseguenza, alcune proprietà (come backgroundColor) non hanno alcun effetto sulla vista stack. Allo stesso modo, non si può ignorare layerClass, drawRect :, o drawLayer: InContext:

+0

Per quanto riguarda come aggiungere un bordo , è più complicato, non può farlo in quel modo. Dovresti aggiungere un'altra vista e usare i contorni del layout. Prova e pubblica una domanda con il codice se non ci riesce! – Clafou

10

La sua possibile farlo avendo viste all'interno della vista pila essere i confini. Questo può essere molto lavoro e ci possono essere alcune situazioni che o non funzioneranno o dovranno essere aggirate, quindi potrebbe non valerne la pena. Dovrai nidificare le viste dello stack in modo da poter fornire i bordi sia in direzione orizzontale che verticale. Nel mio Bordered Stack Views blog post vado più in dettaglio su questo. Ma fondamentalmente ho delle viste regolari con uno sfondo impostato sul colore che scelgo e io do i vincoli di altezza o larghezza di 1 a seconda della direzione dell'asse della vista dello stack. Ecco la piena gerarchia di una griglia 2x2 costruita nel costruttore di interfaccia:

view hierarchy

Con conseguente questo risultato:

enter image description here

Here's a link to my github repo di questo esempio in modo da poter vedere il file storyboard.

+0

Oops Ho fatto un refuso, [corretto] (http://www.koreyhinton.com/blog/bordered-stack-view.html) –

+0

cool tip bro! ha funzionato come un fascino –

6

È possibile incorporare stackView all'interno di un UIView, quindi impostare i bordi di tale vista (colore, larghezza, ecc.) E quindi vincolare stackView a tale UIView come in alto, a sinistra, a destra, in altezza.

0

Ecco un pezzo utile di codice che ho trovato e l'uso:

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) 
    } 
} 

È sufficiente utilizzare in ogni caso come questo:

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

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

Problemi correlati