xcode Interface Builder 未更新 IBDesignable 类
Posted
技术标签:
【中文标题】xcode Interface Builder 未更新 IBDesignable 类【英文标题】:xcode Interface Builder not updating IBDesignable class 【发布时间】:2017-11-24 10:54:05 【问题描述】:在我的项目中,我有几个基于 UITextField 和 UIButton 的自定义类文件。
例如,UITextField 类如下所示:
import UIKit
@IBDesignable class RoundedTextField: UITextField
override func awakeFromNib()
super.awakeFromNib()
layer.cornerRadius = 25
layer.borderWidth = 2
layer.borderColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
clipsToBounds = true
textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
// Placeholder colour
attributedPlaceholder = NSAttributedString(string: placeholder!, attributes: [NSAttributedStringKey.foregroundColor: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)])
// Placeholder text indent
override func textRect(forBounds bounds: CGRect) -> CGRect
return bounds.insetBy(dx: 20, dy: 5)
// Editing text indent
override func editingRect(forBounds bounds: CGRect) -> CGRect
return bounds.insetBy(dx: 20, dy: 5)
这是模拟器显示给我的正确版本: SimScreenshot
这是 IB 向我展示的内容: IBScreenshot
从我的 IB 屏幕截图中可以看出,唯一更新的元素是占位符文本的缩进。该类的其余自定义项没有更新。
有什么想法吗?
附:当我选择一个元素时,在身份检查器中,“Designables”字段为“最新”。
我已经尝试清理、构建和重新启动 Xcode。
谢谢! 斯科特
【问题讨论】:
查看这个答案***.com/questions/45408409/…或这个***.com/questions/44533610/… 感谢 Reinier,我使用了您的第二个链接和另一个来源来解决问题。 【参考方案1】:我在 Reinier 的第二个链接和我之前在 Udemy 上的一门课程的帮助下解决了这个问题。
我在 setupView()
函数中实现了我的自定义。我在prepareForInterfaceBuilder()
和awakeFromNib()
中调用了这个
import UIKit
@IBDesignable class RoundedTextField: UITextField
override func awakeFromNib()
super.awakeFromNib()
setupView()
override func prepareForInterfaceBuilder()
super.prepareForInterfaceBuilder()
self.setupView()
// Placeholder text indent
override func textRect(forBounds bounds: CGRect) -> CGRect
return bounds.insetBy(dx: 20, dy: 5)
// Editing text indent
override func editingRect(forBounds bounds: CGRect) -> CGRect
return bounds.insetBy(dx: 20, dy: 5)
func setupView()
layer.cornerRadius = 25
layer.borderWidth = 2
layer.borderColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
clipsToBounds = true
textColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
// Placeholder colour
attributedPlaceholder = NSAttributedString(string: placeholder!, attributes: [NSAttributedStringKey.foregroundColor: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)])
【讨论】:
【参考方案2】://它会同时更新 Simulator 和 InterfaceBuilder
import UIKit
@IBDesignable class ViewExtended: UIView
override func prepareForInterfaceBuilder()
super.prepareForInterfaceBuilder()
setupView()
func setupView()
layer.borderColor = borderColor.cgColor
layer.borderWidth = borderWidth
layer.cornerRadius = cornerRadius
layer.shadowOpacity = shadowOpacity
layer.shadowRadius = shadowRadius
override func awakeFromNib()
super.awakeFromNib()
setupView()
@IBInspectable var borderColor: UIColor = UIColor.red
didSet
layer.borderColor = borderColor.cgColor
setNeedsLayout()
@IBInspectable var borderWidth: CGFloat = 1.0
didSet
layer.borderWidth = borderWidth
setNeedsLayout()
@IBInspectable var cornerRadius: CGFloat = 10.0
didSet
layer.cornerRadius = cornerRadius
setNeedsLayout()
@IBInspectable var shadowColor: UIColor = UIColor.black
didSet
layer.borderColor = borderColor.cgColor
setNeedsLayout()
@IBInspectable var shadowOpacity: Float = 0.7
didSet
layer.shadowOpacity = shadowOpacity
setNeedsLayout()
@IBInspectable var shadowRadius: CGFloat = 4.0
didSet
layer.shadowRadius = shadowRadius
setNeedsLayout()
@IBInspectable var shadowOffset: CGSize = CGSize(width: 3, height: 3)
didSet
layer.shadowOffset = shadowOffset
setNeedsLayout()
【讨论】:
以上是关于xcode Interface Builder 未更新 IBDesignable 类的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 的 Interface Builder 中的外部对象占位符丢失
在 iOS8 的 Interface Builder 中向 UITableView 添加静态单元格?内容部分未显示
Xcode 和 Interface Builder 随机停止对话