iPhone: переопределить UIButton buttonWithType, чтобы вернуть подкласс - PullRequest
10 голосов
/ 01 апреля 2010

Я хочу иметь возможность создавать UIButton с большой чувствительной областью. Я знаю, что один из способов сделать это - переопределить метод hitTest в подклассе, но как мне вначале создать экземпляр объекта пользовательской кнопки?

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure];

не работает "из коробки", потому что buttonWithType возвращает UIButton, а не OversizedButton.

Похоже, мне нужно переопределить метод buttonWithType. Кто-нибудь знает, как это сделать?

@implementation OversizedButton

+ (id)buttonWithType:(UIButtonType)buttonType
{
   // Construct and return an OversizedButton rather than a UIButton
   // Needs to handle special types such as UIButtonTypeDetailDisclosure
   // I NEED TO KNOW HOW TO DO THIS PART
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{
   // Return results if touch event was in oversized region
   // I ALREADY KNOW HOW TO DO THIS PART
}

@end

В качестве альтернативы, возможно, я мог бы создать кнопку, используя alloc / initWithFrame. Но свойство buttonType доступно только для чтения, так как вы можете создавать пользовательские типы кнопок?

Примечание: я знаю, что есть другие способы сделать это, например, иметь невидимую кнопку позади видимой. Меня не волнует такой подход, и я бы предпочел его избежать. Любая помощь в подходе, описанном выше, будет очень полезна. Спасибо

Ответы [ 3 ]

3 голосов
/ 02 апреля 2010

UIButton buttonWithType: возвращает UIButton или UIRoundedRectButton, в зависимости от значения параметра type.

Поскольку UIButton не предоставляет метод initWithType:, я считаю, что было бы опасно пытаться переопределить buttonWithType:.

Я предлагаю вместо этого подкласс UIControl. Затем вы можете добавить кнопку в качестве подпредставления к своему элементу управления и перехватить hitTest:withEvent:.

1 голос
/ 11 декабря 2013

Вот как я это делаю:

+ (instancetype)customButtonWithCustomArgument:(id)customValue {
    XYZCustomButtom *customButton = [super buttonWithType:UIButtonTypeSystem];
    customButton.customProperty = customValue;
    [customButton customFunctionality];
    return customButton;
}

Работает также с другими типами, UIButtonTypeSystem является лишь примером.

0 голосов
/ 01 апреля 2010

Свойство buttonType нигде не используется в UIKit, и в вашем коде вы всегда можете проверить -isKindOfClass:, поэтому перезапись +buttonWithType: для этого свойства довольно бессмысленна. Просто используйте

return [[[OversizedButton alloc] initWithFrame:...] autorelease];

(Вы можете переопределить тип кнопки недокументированным методом _setButtonType:.)

...