【问题标题】:child view not visible after applying auto layout constraints应用自动布局约束后子视图不可见
【发布时间】:2018-03-11 09:40:05
【问题描述】:

我有一个 xib,它定义了一个灰色矩形的视图。该视图以编程方式添加到位于 UIScrollView 内的 UIStackView。添加的视图显示正常,直到我尝试向灰色矩形添加任何约束,然后它们都消失了。 我对约束的工作方式没有经验,但是我尝试添加的任何约束都会导致灰色矩形消失。 我对 iOS 开发有点陌生,所以任何指向正确方向的指针都值得赞赏。

【问题讨论】:

    标签: ios uiview uiscrollview xib uistackview


    【解决方案1】:

    也许这正是您设置约束的方式(也许您可以发布您的代码?)。我更喜欢使用界面构建器设置约束,因为我是 iOS 开发新手。 This answer 可能会对你有所帮助。

    您是否计划拥有 宽度:100高度:的平方 UIView 100UIViewControllerUIView 内居中?如果是这样,你 可以尝试以下 7 个 Swift 3 Auto Layout sn-ps 之一:


    1。 NSLayoutConstraint + addConstraints(_ constraints: [NSLayoutConstraint]) 风格

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy:
    

    NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerX,乘数:1,常数:0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerY,乘数:1,常数:0) 让 widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem:无,属性:NSLayoutAttribute.notAnAttribute,乘数: 1、常数:100) let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal,toItem:无,属性: NSLayoutAttribute.notAnAttribute,乘数:1,常数:100)

        view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
    }
    

    2。 NSLayoutConstraint + activate(_ constraints: [NSLayoutConstraint]) 风格注意:`activate(_ 约束:

    [NSLayoutConstraint])` 需要 iOS 8

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy:
    

    NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerX,乘数:1,常数:0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerY,乘数:1,常数:0) 让 widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem:无,属性:NSLayoutAttribute.notAnAttribute,乘数: 1、常数:100) let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal,toItem:无,属性: NSLayoutAttribute.notAnAttribute,乘数:1,常数:100)

        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
    }
    

    3。纯视觉格式语言风格+addConstraints(_ constraints: [NSLayoutConstraint])风格

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        let views = ["view": view, "newView": newView]
        let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat:
    

    "H:[view]-(

        view.addConstraints(horizontalConstraints)
        view.addConstraints(verticalConstraints)
    }
    

    4。 NSLayoutConstraint + 视觉格式语言 + activate(_ constraints: [NSLayoutConstraint]) 样式注意:`activate(_

    约束:[NSLayoutConstraint])` 需要 iOS 8

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy:
    

    NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerX,乘数:1,常数:0) let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal,toItem:视图,属性: NSLayoutAttribute.centerY,乘数:1,常数:0)

        let views = ["newView": newView]
        let widthConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:[newView(100)]",
    

    选项:NSLayoutFormatOptions(rawValue: 0),指标:nil,视图: 意见) 让 heightConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:[newView(100)]", 选项:NSLayoutFormatOptions(rawValue:0),指标:无,视图: 意见)

        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
        NSLayoutConstraint.activate(widthConstraints)
        NSLayoutConstraint.activate(heightConstraints)
    }
    

    5。 UIViewAutoresizing style 注意:Springs 和 Struts 在运行时会被翻译成相应的自动布局约束。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = true
        view.addSubview(newView)
    
        newView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
        newView.autoresizingMask = [UIViewAutoresizing.flexibleLeftMargin,
    

    UIViewAutoresizing.flexibleRightMargin, UIViewAutoresizing.flexibleTopMargin, UIViewAutoresizing.flexibleBottomMargin] }


    6。 NSLayoutAnchor + activate(_ constraints: [NSLayoutConstraint]) 样式注:`activate(_ 约束:

    [NSLayoutConstraint])requires iOS 8,NSLayoutAnchor` 需要 iOS 9

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = UIColor.red
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        let widthConstraint = newView.widthAnchor.constraint(equalToConstant: 100)
        let heightConstraint = newView.heightAnchor.constraint(equalToConstant: 100)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
    }
    

    7。子类化 + activate(_ constraints: [NSLayoutConstraint]) 样式注意:activate(_ constraints: [NSLayoutConstraint]) 需要

    iOS 8,NSLayoutAnchor 需要 iOS 9

    import UIKit
    
    class CustomView: UIView {
    
        override var intrinsicContentSize: CGSize {
            return CGSize(width: 100, height: 100)
        }
    
    }
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let newView = CustomView()
            newView.backgroundColor = UIColor.red
            newView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(newView)
    
            let horizontalConstraint = newView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
            let verticalConstraint = newView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
            NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
        }
    
    }
    

    另外,check the documentation

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多