IBDesignable UIButton IB Render без IBInspectables

У меня есть код ниже для создания пользовательского UIButton IBDesignable. Обратите внимание, что у меня нет IBInspectables, так как они мне не нужны. Я хочу, чтобы все мои пользовательские кнопки были одинаковыми.

import UIKit

@IBDesignable class ShButton: UIButton {

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self._setup()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self._setup()
}


override func awakeFromNib() {
    self._setup()
}

override func prepareForInterfaceBuilder() {
    self._setup()
}

private func _setup(){
    self.layer.cornerRadius = 5.0
    self.layer.masksToBounds = true
    self.layer.borderColor = UIColor.whiteColor().CGColor
    self.layer.borderWidth = 1.0
    self.setNeedsDisplay()
}

override func drawRect(rect: CGRect) {
    super.drawRect(rect)
}

deinit {
}

}

Есть две проблемы:

  1. Класс ShButton не отображается в раскрывающемся списке «Пользовательский класс» в IB, мне нужно ввести его вручную, а также указать имя модуля. Я также заметил, что здесь также не отображается индикатор «Designables Up to Date», который отображается во многих учебниках по этому вопросу.
  2. В IB не отображается. Однако, когда я запускаю проект в симуляторе, он отображается правильно. Я что-то упустил, чтобы сделать его рендеринг в IB?

person Kashif    schedule 24.03.2015    source источник
comment
Вы когда-нибудь догадывались об этом?   -  person allthethings    schedule 09.03.2016
comment
Нет Извините, я не мог   -  person Kashif    schedule 09.03.2016
comment
Какую версию Xcode вы используете? Код, который вы предоставили, отлично работает на Xcode 7.2 после того, как он сделал required init(coder aDecoder: NSCoder) ошибочным, изменив его на required init?(coder aDecoder: NSCoder)   -  person Georgi    schedule 09.03.2016


Ответы (1)


Я все еще новичок в iOS, но у меня была похожая ситуация, и это сработало для меня нормально:

@IBDesignable class ShButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self._setup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self._setup()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        self._setup()
    }

    private func _setup(){
        self.layer.cornerRadius = 5.0
        self.layer.masksToBounds = true
        self.layer.borderColor = UIColor.whiteColor().CGColor
        self.layer.borderWidth = 1.0
        self.setNeedsDisplay()
    }
}

Это позволило мне установить cornerRadius по умолчанию для кнопки без использования IBInspectable и работало как в раскадровке, так и во время выполнения.

РЕДАКТИРОВАТЬ: обновленный ответ

person allthethings    schedule 09.03.2016