2013-09-30 17 views
8

Ho alcuni UIButton nella parte inferiore della vista principale della mia app. Questi pulsanti a intermittenza non si evidenziano quando un utente li tocca, ma i loro metodi di destinazione vengono sempre chiamati. Ho scoperto che il riconoscimento dei gesti di Control Center ostacola l'evidenziazione di UIButton. Se sposto la vista contenente verso il centro dello schermo, tutto funziona come progettato.UIButton nella parte inferiore dello schermo evidenzia solo intermittentemente

Il problema è riportato qui https://devforums.apple.com/message/865922

Come una soluzione Ho provato impostazione dello stato evidenziato a mano con il metodo di destinazione. Questo sembra avere lo stesso effetto di consentire l'UIButton di evidenziare normalmente.

Qualche idea su come aggirare questo problema senza ridisegnare questi controlli per apparire altrove nell'app?

Forse utilizzo una vista standard e aggiungo manualmente tutti i metodi per l'interazione touch? Come potrei farlo? Vale la pena esplorare?

+0

I pulsanti a volte non si evidenziano quando l'utente li tocca? E cosa intendi con il riconoscimento gestuale di "Control Center". Intendi i riconoscitori di gesti incorporati nei pulsanti? – bilobatum

+0

Ho modificato la mia domanda. Quando l'utente tocca un pulsante nella parte inferiore dello schermo, viene evidenziato solo in modo intermittente. Ciò è dovuto al gesto di scorrimento riservato per attivare Control Center che blocca l'evidenziazione. –

+0

hai provato a impostare UIControlStateSelected con button.selected = YES? –

risposta

4

Ho trovato una soluzione abbastanza semplice per questo. L'utilizzo di proprietà standard come .highlighted = YES e .selected = YES non sembra funzionare all'interno di quella banda inferiore. Invece di impostare lo stato evidenziato, ho appena impostato l'immagine di sfondo del pulsante sullo stato evidenziato con un ritardo non percepito PRIMA che chiamiamo il metodo finale.

[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 
[self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateHighlighted]; 
[self.stopRecordingButton addTarget:self action:@selector(stopRecordingDelay) forControlEvents:UIControlEventTouchUpInside]; 

-(void)stopRecordingDelay 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton-highlighted"] forState:UIControlStateNormal]; 

    [self performSelector:@selector(stopRecording) withObject:nil afterDelay:0.025f]; 
} 

- (void)stopRecording 
{ 
    [self.stopRecordingButton setImage:[UIImage imageNamed:@"stopRecordingButton"] forState:UIControlStateNormal]; 

    //Do real stuff 
} 
3

Recentemente mi sono imbattuto nello stesso problema e ho cercato ovunque una risposta. Questo è ciò che ha funzionato per me. Era una combinazione di due cose: il gesto di scorrimento indietro UINavigationController e il gesto del centro di controllo iOS 7 (verso l'alto dalla parte inferiore dello schermo).

disattivare il gesto di scorrimento indietro se su un UINavigationController:

in viewDidLoad:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
    self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
} 

Impostare il gesto centro di controllo per mostrare solo una freccia invece di mostrare il centro di controllo prima. Puoi eseguire questa operazione sovrascrivendo il seguente metodo UIViewController:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

Spero che questo aiuti!

+1

Questa è tecnicamente una soluzione, sì, ma richiede la modifica dell'esperienza utente fondamentale nascondendo la barra di stato E disattivando il gesto di ritorno. La mia app non sarebbe un luogo appropriato per nascondere la barra di stato o disabilitare il gesto di ritorno. –

1

Ho pubblicato una correzione per questo problema che riporta il momento saliente descritto in questo question. Il punto saliente è fissato sottoclasse UIButton e override pointInside: per catturare gli eventi touch

+0

La soluzione di cui sopra "impostazione dell'immagine dello stato evidenziata" sembra buona. Ma la soluzione fornita nella discussione citata in questo commento sembra perfetta. – satish

0

Se si dispone di un pulsante che copre l'intero lato inferiore dello schermo è possibile che si verifichi un problema in cui solo la parte sinistra ha questo ritardo.

Al fine di normalizzare i feedback in tempo per il pulsante di tutta la si potrebbe usare la seguente soluzione
(una versione migliorata di Aaron Shekey di):

NSDate *touchDownTime; 

- (void)touchDown 
{ 
    self.alpha = 0.7; 
    touchDownTime = [NSDate date]; 
} 

- (void)touchUpInside 
{ 
    // basically at least 80ms feedback is guaranteed this way 
    // note: timeIntervalSinceNow returns negative 
    NSTimeInterval feedbackTimeLeftToShow = 
     MAX(0.08 + [touchDownTime timeIntervalSinceNow], 0.001); 
    [self performSelector:@selector(touchUpInsideAfterFeedback) 
      withObject:nil 
      afterDelay:feedbackTimeLeftToShow]; 
} 

- (void)touchUpInsideAfterFeedback 
{ 
    self.alpha = 1; 
} 

nota: performSelector può fare bene con valori di ritardo negativi, ma meglio prevenire che curare

Problemi correlati