Можно ли сделать так, чтобы @IBDesignable переопределял значения Interface Builder?

Например, я хочу создать подкласс UIButton и установить для него шрифт 20.0f по умолчанию. Я могу написать что-то вроде этого:

@IBDesignable

class HCButton: UIButton {
  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.customInit()
  }

  func customInit () {
    titleLabel?.font = UIFont.systemFontOfSize(20)
  }
} 

Но это не влияет на предварительный просмотр в Interface Builder, все пользовательские кнопки отображаются с размером шрифта 15.0f по умолчанию. Какие-нибудь мысли?


person orkenstein    schedule 13.08.2015    source источник


Ответы (3)


Я создал новый IBInspectable как testFonts :

import UIKit

@IBDesignable

class CustomButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.customInit()
    }

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

    func customInit () {
        titleLabel?.font = UIFont.systemFontOfSize(20)
    }

    convenience init() {
        self.init(frame:CGRectZero)
        self.customInit()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.customInit()
    }

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

Надеюсь, это поможет вам :)

Это работает для меня.

person Ashish Kakkad    schedule 13.08.2015
comment
Будет ли @IBInspectable var testFonts: UIFont отображаться в Interface Builder? - person orkenstein; 13.08.2015
comment
@orkenstein Нет :( Не отображается, но размер шрифта изменен. - person Ashish Kakkad; 13.08.2015
comment
Удалите его из списка и вставьте titleLabel?.font = UIFont.systemFontOfSize(20) из исходного вопроса. Это может сбить с толку какого-нибудь странника. И спасибо за подсказку! - person orkenstein; 13.08.2015
comment
Да, все в порядке, единственное, о чем я могу сейчас мечтать - сделать это значение по умолчанию вместо значения Font в конструкторе интерфейса. - person orkenstein; 13.08.2015
comment
Эй, @AshishKakkad, отличный пост! Но я заметил, что в моем тестировании функция awakeFromNib не нужна, чтобы сделать настройку customInit видимой в построителе интерфейса. Есть ли причина, по которой вы добавляете это? Кроме того, я считаю, что convenience init() тоже не нужен. - person Yuchen; 24.04.2017

Я думаю, вы также должны переопределить инициализацию с помощью инициализатора фрейма, чтобы повлиять на это.

override init(frame: CGRect) {

    super.init(frame: frame)
    self.customInit()
}
person Zell B.    schedule 13.08.2015

ПРОЩЕ: следующее решение обычно работает или мне

import UIKit

@IBDesignable
class CustomButton: UIButton {
    open override func layoutSubviews() {
        super.layoutSubviews()
        customInit()
    }

    func customInit () {
        titleLabel?.font = UIFont.systemFontOfSize(20)
    }
}

Надеюсь, это то, что вы ищете.

person marcelosalloum    schedule 06.02.2019