почему автоматическое расположение не обновляется, если я использую файл IBDesignable при запуске приложения? - PullRequest
0 голосов
/ 15 октября 2018

Вот проект этой проблемы на диске Google: https://drive.google.com/file/d/1Js0t-stoerWy8O8uIOJl_bDw-bnWAZPr/view?usp=sharing

Я создаю пользовательскую панель навигации (красный вид на рисунке ниже), используя код IBDesignable ниже.Я хочу, чтобы у iPhone был на высшем уровне, как у iPhone X, iPhone XR, тогда высота пользовательской панели навигации равна 88, в противном случае высота равна 64. Я создаю код IBDesignable, чтобы я мог повторно использовать этот код

import UIKit

@IBDesignable
class CustomParentNavigationBarView: UIView {

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setHeight()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.setHeight()
    }

    func setHeight() {
        let deviceHasTopNotch = checkHasTopNotchOrNot()
        layer.frame.size.height = deviceHasTopNotch ? 88 : 64
    }

    func checkHasTopNotchOrNot() -> Bool {
        if #available(iOS 11.0, tvOS 11.0, *) {
            // with notch: 44.0 on iPhone X, XS, XS Max, XR.
            // without notch: 20.0 on iPhone 8 on iOS 12+.
            return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
        }
        return false
    }

}

Я присваиваю CustomParentNavigationBarView красному виду

enter image description here

и затем ставлю метку.который должен располагаться точно под красным видом (пользовательская панель навигации, использующая IBDesignable)

это прекрасно смотрится, если я запускаю приложение на iPhone, которое не имеет высшей ступени, как iPhone8 enter image description here

, но, если я запускаю приложение на iPhone, которое имеет высшую отметку, как iPhone XR, метка теперь находится внутри красного представления, кажется, что она все еще следует за предыдущим автоперекрытием до высоты красного представления, которая ранее составляла 64 (в раскадровкеЯ использую iPhone 8), поэтому, когда пользовательская панель навигации обновляется до 88, когда она работает на iPhone XR, метка по-прежнему соответствует предыдущей высоте 64, а затем она будет находиться внутри красного представления

enter image description here

здесь - автоматическое расположение настраиваемой навигационной панели (красный вид)

enter image description here

и здесь - автоматическое расположениеметки

enter image description here

как решить эту проблему?

1 Ответ

0 голосов
/ 18 октября 2018

Проблема здесь в том, что вы задаете высоту кадра в setHeight (), но также указываете высоту с ограничением макета внутри раскадровки.Один из способов исправить это - указать intrinsicContentSize для вашего представления, а не указывать высоту в качестве ограничения макета в раскадровке.(Iow аналогично тому, как вы полагаетесь на ширину метки, которая будет рассчитана для вас)

@IBDesignable
class CustomParentNavigationBarView: UIView {

    lazy var deviceHasTopNotch: Bool = {
        if #available(iOS 11.0, tvOS 11.0, *) {
            // with notch: 44.0 on iPhone X, XS, XS Max, XR.
            // without notch: 20.0 on iPhone 8 on iOS 12+.
            return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
        }
        return false
    }()

    override var intrinsicContentSize: CGSize {
        let height:CGFloat = deviceHasTopNotch ? 88 : 64
        let width = super.intrinsicContentSize.width //Use whatever you prefer here.  Ex.UIScreen.main.bounds.size.width
        return CGSize(width: width, height: height)
    }
}

В раскадровке

Снимите текущее ограничение высоты дляпользовательский вид.Установите для свойства Intrinsic Size значение Placeholder.

Пример ограничений макета для пользовательской панели навигации.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...