Подтвердить что ты не робот

Как установить тип 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, подклассифицирующем его.

4b9b3361

Ответ 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;
}