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:
.)