IBInspectable 未在情节提要中更新但可在模拟器上运行

IBInspectable not updating in storyboard but works on simulator

我可以在我的模拟器上查看使用 IBInspectable 所做的更改,但不能在我的故事板中查看

我尝试重新安装我的 Xcode,但没有解决这个问题。以下是一些屏幕截图:

所以我知道我的代码工作正常,因为它在模拟器中运行,这完全是一个新项目,所以我没有任何 "Storyboard might still be loading the changes" 问题。

import UIKit

extension UIView {

@IBInspectable
var cornerRadius: CGFloat {
    get {
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
}

@IBInspectable
var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
}

@IBInspectable
var borderColor: UIColor? {
    get {
        let color = UIColor(cgColor: layer.borderColor!)
        return color
    }
    set {
        layer.borderColor = newValue?.cgColor
    }
}

@IBInspectable
var shadowRadius: CGFloat {
    get {
        return layer.shadowRadius
    }
    set {
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.shadowOpacity = 0.4
        layer.shadowRadius = shadowRadius
    }
}
}

您是否检查过在 Interface Builder(编辑器菜单)中设置了 Automatically Refresh ViewsRefresh All Views

更新:试试这个:

 @IBDesignable public class CustomView: UIView {

 @IBInspectable var borderColor: UIColor = .white{
    didSet {
        layer.borderColor = borderColor.cgColor
    }
 }

 @IBInspectable var borderWidth: CGFloat = 2.0 {
    didSet {
        layer.borderWidth = borderWidth
    }
 }

 @IBInspectable var cornerRadius: CGFloat = 10.0 {
    didSet {
        layer.cornerRadius = cornerRadius
    }
 }

 @IBInspectable var shadowRadius: CGFloat {
    get {
        return layer.shadowRadius
    }
    set {
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.shadowOpacity = 0.4
        layer.shadowRadius = shadowRadius
    }

  }

override public func layoutSubviews() {
    super.layoutSubviews()
    clipsToBounds = true
   }
 }

请更新您的代码如下。您必须设置 layer.maskToBound = falseview.clipToBounds = false

import UIKit

extension UIView {

@IBInspectable
var cornerRadius: CGFloat {
    get {
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
}

@IBInspectable
var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
}

@IBInspectable
var borderColor: UIColor? {
    get {
        let color = UIColor(cgColor: layer.borderColor!)
        return color
    }
    set {
        layer.borderColor = newValue?.cgColor
    }
}

@IBInspectable
var shadowRadius: CGFloat {
    get {
        return layer.shadowRadius
    }
    set {
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.shadowOpacity = 0.4
        layer.shadowRadius = shadowRadius
        layer.maskToBounds = false
    }
}
}

首先,您需要 @IBDesignable 指令在 Storyboard 中呈现更新,而 @IBInspectable 仅用于直接在 Storyboard 中访问 属性。

其次,您扩展了 UIView class 以在 Storyboard 中显示可检查的属性,但没有 @IBDesignable.

现在您可能认为添加 @IBDesignable 会解决您的问题,但遗憾的是您不能像这样在扩展程序上应用 @IBDesignable

@IBDesignable //won't work on an extension
extension UIView {
    //...
}

您只能在您有权访问的 class 上应用 @IBDesignable 指令,例如:

@IBDesignable
class MyPrettyDesignableView: UIView {
    //...
}

解决方案:

底线是您应该子class UIView 并在此class.
上应用@IBDesignable 指令 基本上,您唯一的选择是:

@IBDesignable
class MyPrettyDesignableView: UIView {
    
    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
            self.layer.masksToBounds = true
        }
    }
    
    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }
    
    @IBInspectable var borderColor: UIColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1) {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }
    
}

然后在情节提要中,转到您想要在情节提要中设计的视图并将其自定义 class 更改为 MyPrettyDesignableView

  1. 将其自定义 class 更改为您的 IBDesignable subclass:

  2. 设置IBInspectable属性:

您是否尝试过检查自动刷新视图刷新所有视图?它适用于我的 Xcode 9.4.1.

Editor -> Automatically Refresh Views

假设您已经在 class 的声明中正确应用了 @IBDesignable。假设您已经在 classes 的属性上应用了 @IBInspectable,那么这就是对我有用的技巧。

我删除并重新输入 @IBDesignable

有时即使在 class 上添加了 @IBDesignable 并在 属性 定义上添加了 @IBInspectable 之后,您的 Xcode 也可能不会显示和刷新,所以首先 确保您正确使用它们。如果在我的情况下它没有刷新,我必须关闭 Xcode 的所有实例并重新启动 Xcode,然后它将加载新的新界面构建器文件。