2016-08-11 11 views
3

У меня есть подкласс UIButton:Кнопка во время выполнения

class ColorButton: UIButton { 
    override func awakeFromNib() { 
     self.layer.backgroundColor = UIColor.blackColor().CGColor 
     self.layer.cornerRadius = frame.size.width/2 
     self.clipsToBounds = true 
    } 
} 

В интерфейсе строитель, установить кнопку с 4 ограничениями: width = 100, height = 100, centerX, centerY. Кнопка исчезает, когда я запускаю свой код на симуляторе. Однако если он установлен

self.layer.cornerRadius = 50 

это работает. Я не могу разобраться. Если кто-нибудь поймет эту проблему, скажите, пожалуйста.

+0

что ваш frame.size.width в методе awakeNIb? –

+1

frame.size.width возврат 1000 когда распечатать – chieudai14kytu

ответ

2

Добавить в awakeFromNib первой линии:

self.layoutIfNeeded() 

Код:

class ColorButton: UIButton { 
    override func awakeFromNib() { 
     self.layoutIfNeeded() 
     self.layer.backgroundColor = UIColor.blackColor().CGColor 
     self.layer.cornerRadius = frame.size.width/2 
     self.clipsToBounds = true 
    } 
} 
+0

или положить их в viewDidLayoutSubviews! –

+0

это хуже, потому что 'viewDidLayoutSubviews' можно вызывать много раз – Igor

+0

layoutIfNeeded иронически не требуется в awakeFromNib. – monchote

0

Ваш код прекрасно работает в свежем проекте, так что я подозреваю, что проблема где-то в другом месте. Вы забыли позвонить super.awakeFromNib(). От Apple docs:

Вы должны назвать супер реализацию awakeFromNib, чтобы дать родителю классов возможности выполнить любую дополнительную инициализацию они требуют. Хотя реализация этого метода по умолчанию делает ничего, многие классы UIKit предоставляют непустые реализации. Вы можете вызвать супер-реализацию в любой момент во время своего собственного метода awakeFromNib.

enter image description here