2010-04-01 8 views
10

Quiero ser capaz de crear un UIButton con un área de respuesta de gran tamaño. Sé que una forma de hacerlo es anular el método hitTest en una subclase, pero, ¿cómo puedo instanciar mi objeto de botón personalizado en primer lugar?iPhone: anula el botón UIButtonWithType para devolver la subclase

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure]; 

no funciona fuera de la caja, porque buttonWithType devuelve un UIButton, no un OversizedButton.

Parece que también debo reemplazar el método buttonWithType. ¿Alguien sabe como hacer esto?

@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 

Alternativamente, tal vez podría crear el botón utilizando alloc/initWithFrame. Pero la propiedad buttonType es de solo lectura, entonces, ¿cómo se crean los tipos de botones personalizados?

Nota: Sé que hay otras formas de hacerlo, como tener un botón invisible detrás del visible. No me importa ese enfoque y preferiría evitarlo. Cualquier ayuda sobre el enfoque descrito anteriormente sería muy útil. Gracias

Respuesta

0

La propiedad buttonType no se utiliza en cualquier parte UIKit, y en su código siempre se puede comprobar -isKindOfClass:, por lo sobrescribir +buttonWithType: de esta propiedad es bastante inútil OMI. Sólo tiene que utilizar

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

(Puede reemplazar el tipo de botón con el método indocumentado _setButtonType:.)

+7

¿Está sugiriendo seriamente que use un método no documentado en una aplicación comercial que requeriría la aprobación de Apple? – Amagrammer

+0

@Ama: sugiero que no te molestes con la propiedad 'buttonType'. Pero si debe hacerlo, la única forma de cambiarlo es a través de métodos no documentados. – kennytm

+1

Bueno, necesito mostrar los botones UIButtonTypeDetailDisclosure, por lo que "no molestar" no funcionará. ¿Debo suponer que, según su conocimiento, no hay forma de anular el método buttonWithType? Gracias – Amagrammer

3

UIButton buttonWithType: devuelve un UIButton o una UIRoundedRectButton, dependiendo del valor del parámetro type.

Como UIButton no proporciona un método initWithType:, creo que sería peligroso intentar y anular buttonWithType:.

Sugiero la subclase UIControl en su lugar. Luego puede agregar un botón como subvista a su control e interceptar hitTest:withEvent:.

+4

Estoy experimentando con eso porque parece que el otro no es práctico. Aunque parece terriblemente poco elegante. Gracias. – Amagrammer

1

Así es como lo hago:

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

Works también con otros tipos, UIButtonTypeSystem es sólo un ejemplo.

Cuestiones relacionadas