ios – 以编程方式在Swift中的尾随和前导约束(NSLayoutConstraints)

我正在从xib中添加一个视图到我的ViewController中.然后我将其约束实际适合它
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    ...
    ...
    view!.addSubview(gamePreview)
    gamePreview.translatesAutoresizingMaskIntoConstraints = false
    if #available(iOS 9.0,*) {
        // Pin the leading edge of myView to the margin's leading edge
        gamePreview.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor).active = true
        //Pin the trailing edge of myView to the margin's trailing edge
        gamePreview.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor).active = true

    } else {
        // Fallback on earlier versions
        view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .TrailingMargin,relatedBy: .Equal,toItem: view,multiplier: 1,constant: 0))

        view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .LeadingMargin,constant: 0))
    }
    view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Top,toItem: self.topLayoutGuide,attribute: .Bottom,constant: 0))
    view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Height,toItem: nil,attribute: .NotAnAttribute,constant: 131))
}

我正在尝试做什么:实际上适合我的视图约束它顶部,前导,尾随到ViewController的视图,并具有前缀高度.我添加到主视图的视图有自己的透明背景视图,因此不需要边距(视图意味着设备的宽度大小,所以).

我已经放置了两对本来应该相等的线(在我的尝试中)和if,因为if中的前两行实际上在iOS9中可用>只是,虽然我试图在else语句中为每个设备做同样的事情(从iOS 8开始).

这就是我得到的:

左边是iOS9,右边是iOS8.透明背景被涂成红色以显示发生了什么(不要介意在图像中的不同高度,它们在应用程序中的高度相等,而是在左侧和右侧查看增加的边距)

我也试过AutoLayoutDSL-Swift,但没有帮助,我不是专家,但每次尝试都只会让事情变得更糟.

如何使用经典的NSLayoutConstraints方法编写这些约束,以及如何使用AutoLayoutDSL或其分支框架以更好的方式编写所有约束? (或另一种选择,但现在大部分时间我都关注官方文库)

解决方法

您需要使用前导和尾随属性,而不是leadingMargin和trailingMargin属性
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    ...
    ...
    view!.addSubview(gamePreview)
    gamePreview.translatesAutoresizingMaskIntoConstraints = false

    view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Trailing,constant: 0))            
    view.addConstraint(NSLayoutConstraint(item: gamePreview,attribute: .Leading,constant: 0))

    view.addConstraint(NSLayoutConstraint(item: gamePreview,constant: 131))
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...