2012-11-25 5 views
13

Ho inserito un UIButton all'interno di una UIView personalizzata e il pulsante non riceve alcun evento di tocco (non entra nello stato evidenziato, quindi il mio problema è non di non essere in grado di collegare un tocco all'interno del gestore). Ho provato sia inserendolo nel XIB in Interface Builder, e anche provato a aggiungere programmaticamente UIButton in UIView separatamente, entrambi terminati senza fortuna. Tutti i miei punti di vista sono all'interno di un UIScrollView, quindi prima di tutto però UIScrollView potrebbe bloccarli, quindi ho anche aggiunto un pulsante esattamente nello stesso modo in cui aggiungo la mia vista personalizzata in UIScrollView, e il pulsante ha funzionato, eliminando la possibilità che UIScrollView potesse essere la causa di My View hiearchy è come questo:UIButton all'interno di UIView non risponde agli eventi di tocco

ss

Il pulsante è sopra la visualizzazione delle immagini, e lo strato frontale non occupa completamente il mio tasto, quindi non c'è motivo per me non essere fisicamente interagire con il tasto. Al fianco del codice di mio visualizzazione personalizzata, sto creando mio punto di vista in quanto tale:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; 
     [self addSubview:sub]; 
     [sub setUserInteractionEnabled:YES]; 
     [self setUserInteractionEnabled:YES]; 
     CALayer *layer = sub.layer; 
     layer.masksToBounds = YES; 
     layer.borderWidth = 5.0; 
     layer.borderColor = [UIColor whiteColor].CGColor; 
     layer.cornerRadius = 30.0; 
     /*layer.shadowOffset = CGSizeZero; 
     layer.shadowRadius = 20.0; 
     layer.shadowColor = [[UIColor blackColor] CGColor]; 
     layer.shadowOpacity = 0.8; 
     */ 
    } 
    return self; 
} 

Ho provato tutte le combinazioni di setUserInteractionsEnabled, e non ha avuto fortuna. (Sì, impostalo anche su Interface Builder controllato). Ho anche letto in un'altra domanda con un problema simile che dovrei provare a sovrascrivere 'canBecomeFirstResponder' per restituire 'SÌ' e l'ho fatto anche io. Ma il problema persiste, non riesco a fare clic sul pulsante. Non ho dato alcuna proprietà speciale, impostazioni al pulsante, è solo una normale. Gli altri oggetti nella vista (etichette in basso, vista immagine dietro il pulsante, ecc.) Funzionano correttamente senza problemi. Cosa potrebbe esserci di sbagliato qui?

Grazie,

Can.

UPDATE: ecco un breve riproduzione del problema: https://dl.dropbox.com/u/79632924/Test.zip Provare a correre e fare clic sul pulsante.

+0

sarebbe possibile estrarre questa vista in un piccolo progetto di test? –

+0

Domanda stupida: ti sei ricordato di collegare il pulsante ad esso IBAction? –

+0

@HotLicks si, sono collegati. ma il problema non riguarda il fatto che il gestore eventi non si attiva quando viene toccato, il problema è che il pulsante non riceve (o almeno risponde) eventi di tocco. –

risposta

18

Guardando il progetto di test, ho credete al vostro problema nel modo in cui create TestView, non specificate il frame per esso, quindi fondamentalmente la vista genitore è la dimensione 0, e le sottoview che vedete da XIB estendono fuori dalla vista genitore e quindi non ottengono nulla nella catena di risposta .

È necessario specificare il frame durante la creazione di TestView oppure regolare il frame dopo aver caricato il file XIB.

+0

sì, subito dopo aver caricato il progetto di test, era molto più facile da vedere (poiché c'erano molte meno cose nel progetto di test). ora i miei pulsanti funzionano come un incantesimo! –

2

Ho trovato la soluzione. Ero l'inizializzazione mio punto di vista personalizzata come:

MyView *view = [[MyView alloc] init]; 

ho inizializzato invece con una cornice di dimensioni del mio punto di vista, e ha cominciato rispondere agli eventi:

CGRect rect = CGRectMake(0,0,width,height); 
MyView *view = [[MyView alloc] initWithFrame:rect]; 
5

Ho avuto questo problema pure. La causa per me era che il fotogramma superstore UIButton era di altezza 0, quindi credo che anche se un tocco stava accadendo, non veniva trasmesso al pulsante.

Dopo essersi accertati che il superview del pulsante ha preso un rettangolo più grande come una cornice, le azioni del pulsante hanno funzionato.

La causa principale di questo problema da parte mia è stata un'implementazione errata del layout automatico (ho dimenticato di impostare il vincolo di altezza per la sovrastampa del pulsante).