2015-12-10 3 views
17

Я пытаюсь дать 5 отдельных UIStackViews в моих ViewController границах. Я дал каждому из них IBOutlet, а затем позвонил в viewDidLoad, чтобы использовать свойство layer, но безрезультатно. Невозможно ли программно отображать границы стека?Можете ли вы предоставить границы UIStackView?

Код:

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

ответ

18

К сожалению, это не может быть сделано. UIStackView необычен тем, что представляет собой представление «без рендеринга», которое выполняет макет (с использованием ограничений Auto Layout), но не отображает себя. Он имеет слой, подобный всем UIViews, но он игнорируется.

См the Apple doc в разделе "Управление Appearance в представлении стека в":

UIStackView является nonrendering подкласс UIView. Он не предоставляет любой пользовательский интерфейс. Вместо этого он управляет только положением и размером с его расположенными видами. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека. Точно так же, вы не можете переопределить layerClass, DrawRect :, или drawLayer: InContext:

+0

А как добавить границу , это сложнее, не может просто так. Вам нужно будет добавить другое представление и использовать макеты. Попробуйте и поставите вопрос с кодом, если он не увенчался успехом! – Clafou

10

Его можно сделать, имея вид на внутренние точки зрения стека быть границы. Это может быть много работы, и могут быть определенные ситуации, которые либо не будут работать, либо должны быть обработаны, поэтому это может не стоить усилий. Вам нужно будет вложить представления стека, чтобы вы могли предоставлять границы как по горизонтали, так и по вертикали. В моем Bordered Stack Views blog post я подробно расскажу об этом. Но в основном у меня есть регулярные представления, у меня есть фон, заданный по цвету по моему выбору, и я даю ограничения по высоте или ширине 1 в зависимости от направления оси представления стека. Вот полная иерархия 2х2 сетки, построенной в интерфейсе строителя:

view hierarchy

В результате в этот результат:

enter image description here

Here's a link to my github repo этого примера, так что вы можете увидеть раскадровки файл.

+0

К сожалению, я сделал опечатку, [исправлено] (http://www.koreyhinton.com/blog/bordered-stack-view.html) –

+0

крутой отзыв bro! работал как чары –

6

Вы можете встроить stackView внутри UIView, затем установить границы этого вида (цвет, ширина и т. Д.), А затем ограничить stackView этим UIView, как сверху, влево, вправо, по высоте.

0

Вот удобный кусок кода, который я нашел и использование:

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

Просто используйте любой точки зрения, как это:

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

Источник: How to add only a TOP border on a UIButton?

Смежные вопросы