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 Views
和 Refresh 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 = false
和 view.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
。
将其自定义 class 更改为您的 IBDesignable
subclass:
设置IBInspectable
属性:
您是否尝试过检查自动刷新视图或刷新所有视图?它适用于我的 Xcode 9.4.1.
Editor -> Automatically Refresh Views
假设您已经在 class 的声明中正确应用了 @IBDesignable
。假设您已经在 classes 的属性上应用了 @IBInspectable
,那么这就是对我有用的技巧。
我删除并重新输入 @IBDesignable
。
有时即使在 class 上添加了 @IBDesignable 并在 属性 定义上添加了 @IBInspectable 之后,您的 Xcode 也可能不会显示和刷新,所以首先
确保您正确使用它们。如果在我的情况下它没有刷新,我必须关闭 Xcode 的所有实例并重新启动 Xcode,然后它将加载新的新界面构建器文件。
我可以在我的模拟器上查看使用 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 Views
和 Refresh 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 = false
和 view.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
。
将其自定义 class 更改为您的
IBDesignable
subclass:设置
IBInspectable
属性:
您是否尝试过检查自动刷新视图或刷新所有视图?它适用于我的 Xcode 9.4.1.
Editor -> Automatically Refresh Views
假设您已经在 class 的声明中正确应用了 @IBDesignable
。假设您已经在 classes 的属性上应用了 @IBInspectable
,那么这就是对我有用的技巧。
我删除并重新输入 @IBDesignable
。
有时即使在 class 上添加了 @IBDesignable 并在 属性 定义上添加了 @IBInspectable 之后,您的 Xcode 也可能不会显示和刷新,所以首先 确保您正确使用它们。如果在我的情况下它没有刷新,我必须关闭 Xcode 的所有实例并重新启动 Xcode,然后它将加载新的新界面构建器文件。