Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 旋转设备时约束不起作用_Ios_Swift_Constraints_Nslayoutconstraint - Fatal编程技术网

Ios 旋转设备时约束不起作用

Ios 旋转设备时约束不起作用,ios,swift,constraints,nslayoutconstraint,Ios,Swift,Constraints,Nslayoutconstraint,我有一个UIViewController: import UIKit class ViewController: UIViewController { var object: DraggableView? override func viewDidLoad() { super.viewDidLoad() // Create the object object = DraggableView(parent: self)

我有一个UIViewController:

import UIKit

class ViewController: UIViewController {

    var object: DraggableView?

    override func viewDidLoad() {
        super.viewDidLoad() 
        // Create the object
        object = DraggableView(parent: self)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Add subview
        object?.setup()
    }
}
我有一个类在这个VC中添加视图:

import UIKit

class DraggableView {

    var parent: UIViewController!

    let pieceOfViewToShow: CGFloat = 30.0

    init(parent: UIViewController) {
        self.parent = parent
    }

    func setup() {
        let view = UIView(frame: parent.view.frame)
        view.backgroundColor = UIColor.red
        parent.view.addSubview(view)
        view.translatesAutoresizingMaskIntoConstraints = false

        view.leadingAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        view.trailingAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        view.heightAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.heightAnchor).isActive = true

        // I need to show only a piece of the view at bottom, so:
        view.topAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.topAnchor, constant: parent.view.frame.height - pieceOfViewToShow).isActive = true
    }
}
问题 一切都是正确的,但当设备旋转时,它将丢失约束,并且添加的视图将丢失

我认为问题出在下一行,当设备旋转时,无法更新正确的高度[parent.view.frame.height]

view.topAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.topAnchor, constant: parent.view.frame.height - pieceOfViewToShow).isActive = true
旋转时,如何更新该常数?
我使用的是Swift 3。

您可以尝试在
UIView
上使用
traitCollectionDidChange
回调来更新旋转更改时的约束,为此,您需要使
DraggableView
成为
UIView
的子类:

import UIKit

class DraggableView: UIView {

    var parent: UIViewController!

    let pieceOfViewToShow: CGFloat = 30.0

    // keep the constraint around to have access to it
    var topConstraint: NSLayoutConstraint?

    init(parent: UIViewController) {
        super.init(frame: parent.view.frame)
        self.parent = parent
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setup() {
        self.backgroundColor = UIColor.red
        parent.view.addSubview(self)
        self.translatesAutoresizingMaskIntoConstraints = false

        self.leadingAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        self.trailingAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        self.heightAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.heightAnchor).isActive = true

        // keep a reference to the constraint
        topConstraint = self.topAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.topAnchor, constant: parent.view.frame.height - pieceOfViewToShow)
        topConstraint?.isActive = true
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        // update the constraints constant
        topConstraint?.constant = parent.view.frame.height - pieceOfViewToShow
    }
}

@JaredPérez很抱歉,没有注意到
DragableView
没有从
UIView
子类化。。只需使用更新版本我认为这是一个不错的选择,但是在类DragTableView中不能使用以下方法:
func-traitCollectionDidChange