UIStackViews
の境界線に5つの個別のViewController
を指定しようとしています。それぞれにIBOutlet
を与え、viewDidLoad
で呼び出してlayer
プロパティを使用しましたが、役に立ちませんでした。プログラムでスタックビューに境界線を付けることはできませんか?
コード:
@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
}
残念ながら、これはできません。 UIStackViewは、(自動レイアウト制約を使用して)レイアウトを実行するが、それ自体を表示しない「非レンダリング」ビューであるという点で異常です。すべてのUIViewのようなレイヤーがありますが、無視されます。
「スタックビューの外観の管理」の the Apple doc を参照してください。
UIStackViewは、UIViewの非レンダリングサブクラスです。独自のユーザーインターフェイスは提供しません。代わりに、配置されたビューの位置とサイズを管理するだけです。その結果、いくつかのプロパティ(backgroundColorなど)はスタックビューに影響しません。同様に、layerClass、drawRect :、またはdrawLayer:inContext:をオーバーライドすることはできません。
スタックビュー内のビューを境界線にすることでこれを行うことができます。これには多くの作業が必要になる可能性があり、機能しない、または回避する必要がある特定の状況が存在する可能性があるため、努力する価値はありません。水平方向と垂直方向の両方に境界線を提供できるように、スタックビューをネストする必要があります。 Bordered Stack Viewsブログ投稿 でこれについてさらに詳しく説明します。しかし、基本的には、通常のビューには選択した色に設定された背景があり、スタックビューの軸の方向に応じて高さまたは幅の制約を1に設定します。以下に、インターフェイスビルダーに組み込まれた2x2グリッドの完全な階層を示します。
この結果は次のとおりです。
この例のgithubリポジトリへのリンク この例の場合、ストーリーボードファイルを見ることができます。
StackViewをUIView内に埋め込み、そのビューの境界(色、幅など)を設定し、stackViewをそのUIViewに上、左、右、高さのように制約できます。
ここに私が見つけて使用した便利なコードの塊があります:
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)
他の人が示したように、これを行うことはできません(詳細については、Clafouの回答を参照してください)。
ただし、できることは、スタックビューを別のUIViewに埋め込むことです。囲んでいるUIViewのレイヤーを変更します。