旋转设备时约束不起作用

时间:2018-02-21 10:23:02

标签: ios swift constraints nslayoutconstraint

我有这个UIViewController:

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
    }
}

我有这个类在这个VC中添加视图:

view.topAnchor.constraint(equalTo: parent.view.safeAreaLayoutGuide.topAnchor, constant: parent.view.frame.height - pieceOfViewToShow).isActive = true

问题

一切都是正确的,但是当设备旋转时,它会丢失约束,并且添加的视图会丢失。

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

QBitmap map(100,100);     //my pixmap is 100x100
map.fill(Qt::color0);
QPainter painter( &map );
painter.setBrush(Qt::color1);
painter.drawRoundRect(0,0,100,100,20,20);
p.setMask(map);
ui->image1->setPixmap(p);

旋转时如何更新此常量? 我正在使用Swift 3。

1 个答案:

答案 0 :(得分:2)

您可以尝试在traitCollectionDidChange上使用UIView回调来更新旋转更改时的约束,为此,您需要将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
    }
}