2010-04-01 11 views
10

Desidero essere in grado di creare un UIButton con un'area reattiva sovradimensionata. So che un modo per farlo è sovrascrivere il metodo hitTest in una sottoclasse, ma come faccio a creare un'istanza del mio oggetto pulsante personalizzato in primo luogo?iPhone: Sovrascrivi pulsante UIButtonWithType per restituire sottoclasse

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure]; 

non funziona out of the box, perché buttonWithType restituisce un UIButton, non un OversizedButton.

Quindi sembra che sia necessario sovrascrivere anche il metodo buttonWithType. Qualcuno sa come fare questo?

@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 

In alternativa, potrei creare il pulsante utilizzando alloc/initWithFrame. Ma la proprietà buttonType è di sola lettura, quindi come si creano i tipi di pulsanti personalizzati?

Nota: so che ci sono altri modi per farlo, come avere un pulsante invisibile dietro quello visibile. Non mi interessa per questo approccio e preferirei evitarlo. Qualsiasi aiuto sull'approccio sopra descritto sarebbe molto utile. Grazie

risposta

0

La proprietà buttonType non è utilizzata da nessuna parte in UIKit e nel codice è sempre possibile controllare -isKindOfClass:, quindi la sovrascrittura di +buttonWithType: per questa proprietà è IMO piuttosto inutile. Basta usare

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

(è possibile ignorare il tipo di pulsante con il metodo non documentato _setButtonType:.)

+7

Stai seriamente suggerendo di utilizzare un metodo non documentato in un'applicazione commerciale che richiederebbe l'approvazione di Apple? – Amagrammer

+0

@Ama: ti suggerisco di non preoccuparti della proprietà 'buttonType'. Ma se è necessario, l'unico modo per cambiarlo è tramite metodi non documentati. – kennytm

+1

Bene, ho bisogno di visualizzare i pulsanti UIButtonTypeDetailDisclosure, quindi "non disturbare" non funzionerà. Devo presumere che a tua conoscenza non c'è modo di sovrascrivere il metodo buttonWithType? Grazie – Amagrammer

3

UIButton buttonWithType: restituisce una UIButton o un UIRoundedRectButton, a seconda del valore del parametro type.

Poiché UIButton non fornisce un metodo initWithType:, credo che sarebbe pericoloso provare e sovrascrivere buttonWithType:.

Ti suggerisco invece sottoclasse UIControl. È quindi possibile aggiungere un pulsante come sottoview al controllo e intercettare hitTest:withEvent:.

+4

Sto sperimentando questo perché sembra che l'altro non sia pratico. Sembra terribilmente inelegante però. Grazie. – Amagrammer

1

Ecco come lo faccio:

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

funziona anche con altri tipi, UIButtonTypeSystem è solo un esempio.

Problemi correlati