3 つのサブビューを持つ縦型UIStackView
があり、これら 3 つのサブビューすべてのコンテンツを中央に配置したいと考えています。ストーリーボードではなく、すべてプログラムでこれを行っています。ストーリーボードを使用することから始めて、最後に追加するだけで、arrangedSubview
さらに複雑なことを追加しました。
スタック ビュー自体、各サブビュー、およびそれらすべてを同時に設定してみました (以下を参照)。それらのどれも何の影響もありません - これらの 3 つのサブビューのすべては、私が何をしても、コンテナー ビューに対してフラッシュ レフトのままです。また、別のスレッドで見たものに基づいて、自動サイズ変更サブビューが IB でチェックされていないことを確認しましたが、どちらも違いはありませんでした。
ここで私が間違っていることを誰かに教えてもらえますか? ありがとう。
override func viewDidLoad() {
super.viewDidLoad()
let horizontalCenter = self.view.frame.width/2
let verticalCenter = self.view.frame.height/2
// the stackview that lives in 'emptyLogView'
let liftLogStackView = UIStackView(frame: CGRect(x: horizontalCenter, y: verticalCenter, width: 320, height: 480))
liftLogStackView.axis = .Vertical
liftLogStackView.distribution = UIStackViewDistribution.FillEqually
liftLogStackView.contentMode = .Center
// 1st subview
let weightsImage = UIImage(named: "weights_image")
let weightsContainerView = UIImageView(image: weightsImage)
weightsContainerView.frame = CGRect(x: 0, y: 0, width: 320, height: 77)
weightsContainerView.contentMode = .Center
// 2nd subview
let noLiftsMessageContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
let noLiftsMessage = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 20))
noLiftsMessage.text = "You don't have any lifts saved."
noLiftsMessage.textColor = UIColor(hexString: "b7b7b7")
noLiftsMessageContainerView.contentMode = .Center
// 3rd subview
let letsDoThisContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
let doThisButton = UIButton(frame: CGRect(x: 0, y: 0, width: 120, height: 36))
doThisButton.setTitle("Let's do this.", forState: .Normal)
doThisButton.setTitleShadowColor(UIColor.blackColor(), forState: .Highlighted)
doThisButton.layer.cornerRadius = 6
doThisButton.layer.backgroundColor = UIColor(hexString: "b7b7b7").CGColor
doThisButton.layer.borderWidth = 0
letsDoThisContainerView.contentMode = .Center
noLiftsMessageContainerView.addSubview(noLiftsMessage)
letsDoThisContainerView.addSubview(doThisButton)
liftLogStackView.addArrangedSubview(weightsContainerView)
liftLogStackView.addArrangedSubview(noLiftsMessageContainerView)
liftLogStackView.addArrangedSubview(letsDoThisContainerView)
liftLogStackView.translatesAutoresizingMaskIntoConstraints = false
emptyLogView.addSubview(liftLogStackView)
let horizontalCenterConstraint = NSLayoutConstraint(item: liftLogStackView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: emptyLogView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
let verticalCenterConstraint = NSLayoutConstraint(item: liftLogStackView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: emptyLogView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
emptyLogView.addConstraint(horizontalCenterConstraint)
emptyLogView.addConstraint(verticalCenterConstraint)
}
アップデート
6年前のSOスレッドでもう1つ試してみましたが、どちらも機能しませんでした:
let letsDoThisContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
let doThisButton = UIButton(frame: CGRect(x: 0, y: 0, width: 120, height: 36))
doThisButton.setTitle("Let's do this.", forState: .Normal)
doThisButton.setTitleShadowColor(UIColor.blackColor(), forState: .Highlighted)
doThisButton.layer.cornerRadius = 6
doThisButton.layer.backgroundColor = UIColor(hexString: "b7b7b7").CGColor
doThisButton.layer.borderWidth = 0
// this is the new thing
let contentAlignmentMode = UIViewContentMode.Center
liftLogStackView.contentMode = contentAlignmentMode
また、別の設定を試みましたcontentMode
が.Right
、何も起こりません。私が何をしても、要素はすべて左に詰まっています。
更新 2
答えの一部を見つけました(と思います)。それはUIStackViewAlignment
私が必要なもののようです。だから私は今これを持っています:
let liftLogStackView = UIStackView(frame: CGRect(x: horizontalCenter, y: verticalCenter, width: 320, height: 480))
liftLogStackView.axis = .Vertical
liftLogStackView.distribution = UIStackViewDistribution.FillEqually
// Finally, this has an affect on the alignment
liftLogStackView.alignment = UIStackViewAlignment.Center
しかし、中央揃えではなく、ほぼ右揃えのように見えます (青いボックスはスタック ビューです)。
ビューが親ビューの境界を認識していないように見えますが、スタックビューとそのサブビューを正しく作成していると思います。
何か案は?