Swift 无法从 @IBDesignable 类设置视图的高度

Posted

技术标签:

【中文标题】Swift 无法从 @IBDesignable 类设置视图的高度【英文标题】:Swift cannot set view's height from @IBDesignable class 【发布时间】:2018-11-17 09:16:01 【问题描述】:

我正在尝试处理不同 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】:

第一个需要以下形式:

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
    
 

【讨论】:

第一个很有魅力!我不想修改 viewDidload 中的约束,因为我不想遍历每个控制器。 NSLayoutConstraint 子类就可以了。

以上是关于Swift 无法从 @IBDesignable 类设置视图的高度的主要内容,如果未能解决你的问题,请参考以下文章

使用Swift在Xcode 9中不显示IBDesignable UI

无法将自定义 IBDesignable 类链接到情节提要上的 UIButton

如何从 UIBezierPath 创建 IBDesignable 自定义 UIView?

Swift @IBDesignable/@IBInspectable UIView 样式

Xcode 9.2 和 Swift 4 中的 AppKit 的 IBDesignable 是不是损坏?

swift 来自http://nshipster.com/ibinspectable-ibdesignable/