Потенциальная утечка объекта - NSData

Это минимальное решение, которое я нашел, чтобы заставить высоту правильно обновляться. Кажется, что есть два ключевых компонента:

  • В иерархию представления необходимо добавить представление с translatesAutoresizingMaskIntoConstraints, установленное в false.
  • Ограничение высоты должно добавляется не раньше viewWillAppear.

Я все еще вижу ошибку Unable to simultaneously satisfy constraints в журнале, но, похоже, все равно работает нормально. Я также все еще вижу прыжок, где высота изначально устанавливается на значение по умолчанию, а затем переходит к заданному значению. Я еще ничуть не выяснил ни одну из этих проблем.

import UIKit

class KeyboardViewController: UIInputViewController {

    var heightConstraint: NSLayoutConstraint!

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.inputView.addConstraint(self.heightConstraint)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let dummyView = UILabel(frame:CGRectZero)
        dummyView.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.addSubview(dummyView);

        let height : CGFloat = 400

        self.heightConstraint = NSLayoutConstraint( item:self.inputView, attribute:.Height, relatedBy:.Equal, toItem:nil, attribute:.NotAnAttribute, multiplier:0.0, constant:height)
    }
}

Обновление для Swift 4:

import UIKit

class KeyboardViewController: UIInputViewController
{
    private weak var _heightConstraint: NSLayoutConstraint?

    override func viewWillAppear(_ animated: Bool)
    {
        super.viewWillAppear(animated)

        guard nil == _heightConstraint else { return }

        // We must add a subview with an `instrinsicContentSize` that uses autolayout to force the height constraint to be recognized.
        //
        let emptyView = UILabel(frame: .zero)
        emptyView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(emptyView);

        let heightConstraint = NSLayoutConstraint(item: view,
                                                  attribute: .height,
                                                  relatedBy: .equal,
                                                  toItem: nil,
                                                  attribute: .notAnAttribute,
                                                  multiplier: 0.0,
                                                  constant: 240)
        heightConstraint.priority = .required - 1
        view.addConstraint(heightConstraint)
        _heightConstraint = heightConstraint
    }
}
0
задан Snowcrash 25 February 2015 в 13:53
поделиться