Как установить тип UIButton в подкласс UIButton
Я подклассифицирую UIButton, я хочу установить тип кнопки Round Rect.
button.h
@interface Button : UIButton {}
- (void)initialize;
@end
Button.m
@implementation Button
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initialize];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self){
[self initialize];
}
return self;
}
- (void)initialize
{
self.titleLabel.font = [UIFont systemFontOfSize:20];
self.titleLabel.textColor = [UIColor redColor];
self.titleLabel.textAlignment = UITextAlignmentCenter;
//[UIButton buttonWithType:UIButtonTypeRoundedRect];
}
@end
Здесь я пробовал [UIButton buttonWithType:UIButtonTypeRoundedRect]
, но он не работает. Может ли кто-нибудь предложить, как заставить его работать?
Я знаю, что во многих предыдущих сообщениях было сказано, что Subclassing UIButton не рекомендуется, но тот факт, что в Developer Docs нет упоминания об NOT, подклассифицирующем его.
Ответы
Ответ 1
Вы можете найти обсуждение в потоке CocoaBuilder Как подкласс UIButton? полезен, особенно Предложение Jack Nutting игнорировать buttonType:
Обратите внимание, что таким образом buttonType явно не задан ничем, что, вероятно, означает, что это UIButtonTypeCustom. Документы не на самом деле указывают это, но поскольку это значение 0 в перечислите, что, вероятно, что произойдет (и это, по-видимому, наблюдаемое поведение)
Ответ 2
не совсем то, что вы ищете, но помните, что ваш подкласс все еще имеет метод buttonWithType, и он отлично работает.
buttonWithType вызывает ваши подклассы initWithFrame и устанавливает тип соответствующим образом.
SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];
Ответ 3
UIButton
подкласс в Swift
* Следующий код работает в Swift 3 и выше.
Вы не можете установить buttonType
подкласса UIButton
по дизайну. Он автоматически устанавливается на custom
, что означает, что вы получаете простой вид и поведение в качестве отправной точки.
Если вы хотите повторно использовать код, который устанавливает внешний вид кнопки, вы можете сделать это без подкласса. Один из подходов заключается в предоставлении factory методов, которые создают UIButton
и устанавливают визуальные свойства.
Пример factory, чтобы избежать подкласса
extension UIButton {
static func createStandardButton() -> UIButton {
let button = UIButton(type: UIButtonType.system)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.setTitleColor(UIColor.black, for: .normal)
button.setTitleColor(UIColor.gray, for: .highlighted)
return button
}
}
let button = UIButton.createStandardButton()
Я избегаю подклассификации UIButton
, когда достаточно других методов настройки. Пример метода factory - это один из вариантов. Существуют и другие опции, включая API UIAppearance и т.д.
Иногда возникают потребности в настройке, требующие подкласса. Например, я создал подклассы UIButton
, чтобы точно контролировать, как кнопка анимируется в ответ на события касания или чтобы кнопка вызывала предопределенный делегат или закрытие при нажатии (в отличие от назначения #selector
для каждого экземпляра).
Ниже приведен базовый пример подкласса UIButton
в качестве отправной точки.
Пример подкласса UIButton
internal class CustomButton: UIButton {
init() {
// The frame can be set outside of the initializer. Default to zero.
super.init(frame: CGRect.zero)
initialize()
}
required init?(coder aDecoder: NSCoder) {
// Called when instantiating from storyboard or nib
super.init(coder: aDecoder)
initialize()
}
func initialize() {
print("Execute common initialization code")
}
}
let button = CustomButton()
print(button.buttonType == .custom) // true
Заметка о UIButtonType
Поскольку вопрос был задан в 2012 году, UIButtonType.roundedRect
устарел. В комментариях файла заголовка говорят, что вместо этого используйте UIButtonType.system
.
Ниже приведено UIButton.h, преобразованное в Swift в Xcode
public enum UIButtonType : Int {
case custom // no button type
@available(iOS 7.0, *)
case system // standard system button
case detailDisclosure
case infoLight
case infoDark
case contactAdd
public static var roundedRect: UIButtonType { get } // Deprecated, use UIButtonTypeSystem instead
}
Ответ 4
С iOS7 это более актуально, чем раньше, поскольку иногда вам нужно использовать UIButtonTypeSystem, и вы не можете просто переопределить init и сделать [MyButton alloc] init], потому что тогда это UIButtonTypeCustom, который не отражает tintColor не имеют хороших эффектов выцветания.
В подкласс создайте статический конструктор следующим образом:
+ (instancetype)myButtonWithTitle:(NSString *)title imageNamed:(NSString *)imageName target:(id)target action:(SEL)action {
MyButton *button = [self buttonWithType:UIButtonTypeSystem];
... my custom setup for title, image, target, etc ...
return button;
}
Ответ 5
Вы можете определенно подкласса UIButton. Я успешно создал DateButton, который выглядит как UITextField, но когда пользователь прикасается к нему, он отображает DatePicker в Popover. Имеет свойство для хранения даты и т.д. Сообщите мне, если вышеуказанное никогда не решило вашу проблему, и я опубликую подробности подробнее.
Ответ 6
Как насчет этого?
- (id)initWithFrame:(CGRect)frame
{
self = [UIButton buttonWithType:UIButtonTypeRoundedRect];
if (self) {
self.frame = frame;
}
return self;
}