Запутался в том, как / где установить высоту Xib

#ios #swift #xcode #interface-builder

#iOS #swift #xcode #конструктор интерфейса

Вопрос:

У меня есть пользовательский вид и xib. Я использую это пользовательское представление в одном из представлений контроллера моей раскадровки.

У меня есть вариант использования, в котором я хочу иметь возможность скрыть пользовательский вид (и довести его высоту до нуля). Прямо сейчас я устанавливаю высоту в построителе интерфейса и устанавливаю ограничения на края супервизора:

введите описание изображения здесь

Как вы можете видеть, я хочу, чтобы его высота была 84 везде.

Теперь вот класс моего пользовательского представления:

 import UIKit

@IBDesignable
class BannerView: UIView {

    @IBOutlet var contentView: UIView!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        initialize()
    }
    
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        initialize()
        contentView?.prepareForInterfaceBuilder()
    }
    
    func initialize() {
        guard let view = loadViewFromNib() else { return }
        view.frame = self.bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "BannerView", bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
    
    func hide() {
        // Hide the view and set its height to zero here
    }

}

  

Но теперь я в замешательстве… должен ли я также устанавливать ограничение высоты в пользовательском представлении при загрузке его в одну из моих раскадровок? Или его высота должна быть 84 везде, и мне не нужно указывать ее дальше?

Кроме того, как бы мне скрыть пользовательский вид и установить его высоту равной нулю в приведенной выше hide() функции?

Ответ №1:

Есть несколько способов сделать это… вот один.

Укажите содержимое ваших ограничений xib, чтобы его высота составляла 84 пункта. Вы не показали макет своего xib, но я предполагаю, что вы знаете, как это сделать.

Затем, когда вы добавляете BannerView в свой основной вид (я предполагаю, что это то, что вы делаете), вставьте его в вертикаль UIStackView с этими свойствами:

введите описание изображения здесь

Теперь, когда вы устанавливаете bannerView.isHidden = true , представление стека автоматически удаляет его из вычислений высоты, в результате чего представление стека имеет нулевую высоту.

bannerView.isHidden = false Затем настройка повторно отобразит вид баннера вместе с его высотой.

Ответ №2:

Поскольку вы хотите, чтобы высота представления везде была 84, я думаю, вам следует добавить выход с ограничением высоты и установить значение 84. Установите значение ограничения равным 0, чтобы скрыть представление (я настоятельно рекомендую не скрывать какое-либо представление, делая это).

Комментарии:

1. Установил бы я ограничение высоты в Xib или где я включаю пользовательский вид в контроллер раскадровки?