IPhone: переопределить UIButton buttonWithType для возврата подкласса

Я хочу создать 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 доступно только для чтения, поэтому как вы создаете пользовательские типы кнопок?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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