Я хочу смочь создать 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 свойство только для чтения, поэтому как Вы создаете типы пользовательской кнопки?
Примечание: Я знаю, что существуют другие способы сделать это, такое как наличие невидимой кнопки позади видимой. Я не забочусь о том подходе и предпочел бы избегать его. Любая справка на подходе, описанном выше, была бы очень полезна. Спасибо
UIButton buttonWithType:
возвращает UIButton
или UIRoundedRectButton
, в зависимости от значения параметр типа
.
Поскольку UIButton
не предоставляет метод initWithType:
, я считаю, что было бы опасно пытаться переопределить buttonWithType:
.
Вместо этого я предлагаю вам подкласс UIControl
. Затем вы можете добавить кнопку в качестве подпредставления к своему элементу управления и перехватить hitTest: withEvent:
.
Кнопка Тип кнопки
не используется нигде в UIKit, и в вашем коде вы всегда можете проверить -isKindOfClass:
, поэтому перезапись + buttonWithType:
для этого свойства довольно бессмысленна IMO. Просто используйте
return [[[OversizedButton alloc] initWithFrame:...] autorelease];
(вы можете переопределить тип кнопки с помощью недокументированного метода _setButtonType:
.)