xcode Interface Builder不更新IBDesignable类

时间:2017-11-24 10:54:06

标签: ios xcode interface-builder ibdesignable

在我的项目中,我有几个基于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屏幕截图中可以看到,更新的唯一元素是占位符文本的缩进。该类的其余定制不会更新。

有什么想法吗?

P.S。当我选择一个元素时,在身份检查器中,“Designables”字段是“最新的”。

我尝试过清理,构建和重新启动Xcode。

谢谢! 斯科特

2 个答案:

答案 0 :(得分:0)

我在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)])
    }
}

答案 1 :(得分:0)

//它将同时更新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()
        }
    }
}