Swift не может установить высоту представления из класса @IBDesignable - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь обработать высоты просмотра для различных iPhone (в портретном режиме), поскольку XCode считает, что высота iPhone 5 и iPhone XS в портретном режиме является обычной.

Для этого я попробовал два метода:

1) Подклассы NSLayoutConstraint:

    @IBDesignable class AdaptiveConstraint: NSLayoutConstraint { 

    @IBInspelctable override var constant: CGFloat {
          get { return self.constant } 
          set { self.constant = newValue + A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE }}}

2) Подкласс UIView:

@IBDesignable class AttributedView: UIView {

@IBInspectable var height: CGFloat {
    get {
        return self.heightAnchor.constraint(equalToConstant: self.bounds.height).constant
    }
    set {
        self.heightAnchor.constraint(equalToConstant: self.bounds.height).constant = newValue + A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE

    }}}

Первый сбой в сеттере, второй не имеет эффектов. Буду признателен за любые предложения. Заранее спасибо!

1 Ответ

0 голосов
/ 17 ноября 2018

Для первого потребуется следующая форма:

override var constant: CGFloat {
   get {
      // note we are calling `super.`, added subtract for consistency
      return super.constant - A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE
   } 
   set {
     // note we are calling `super.`
      super.constant = newValue + A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE
   }
}

Второй создает новое ограничение каждый раз, когда вы его вызываете.Ограничение не добавляется в иерархию просмотра и не активируется.Он выпущен немедленно.

Для этого потребуется следующая форма:

// it would be better to create and add it in viewDidLoad though
lazy var heightConstraint: NSLayoutConstraint = {
    let constraint = self.heightAnchor.constraint(equalToConstant: self.bounds.height)
    constraint.isActive = true
    return constraint
}()

@IBInspectable var height: CGFloat {
    get {
        return self.heightConstraint.constant - A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE
    }
    set {
        self.heightConstraint.constant = newValue + A_VARIABLE_I_USE_BASED_ON_IPHONE_TYPE
    }
 }
...