UIButton tocco è in ritardo, quando in UIScrollView
-
30-09-2019 - |
Domanda
Io corro in un piccolo problema nella mia app.
I essenzialmente ha una serie di UIButtons
aggiunto come subviews in UIScrollView
che fa parte di un pennino. Ogni Ho tap tempo su un pulsante c'è un ritardo notevole prima che il pulsante è evidenziato. Ho in sostanza devo tenerlo premuto per circa mezzo secondo prima che le si affievolisce e pulsante appare selezionato.
Sto assumendo questo è perché le esigenze UIScrollView
per determinare se il tocco è un rotolo o se si tratta di un tocco che si intende per una visualizzazione secondaria.
In ogni modo, io sono un po 'incerto su come procedere. Voglio semplicemente il pulsante per apparire selezionato, non appena si tocca di esso.
Ogni aiuto è apprezzato!
Modifica
Ho provato a installare delaysContentTouches
a NO , ma lo scorrimento diventa quasi impossibile, poiché la maggior parte della mia ScrollView è pieno di UIButtons
.
Soluzione 2
Ok ho risolto questo sottoclassi UIScrollView
e sovrascrivendo touchesShouldCancelInContentView
Ora la mia UIButton
che è stato etichettato come 99 evidenzia correttamente e la mia ScrollView scorre!
myCustomScrollView.h :
@interface myCustomScrollView : UIScrollView {
}
@end
e myCustomScrollView.m :
@implementation myCustomScrollView
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if (view.tag == 99)
return NO;
else
return YES;
}
Altri suggerimenti
La soluzione di Jeff non è stato del tutto lavorando per me, ma questo si fa simile: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state
Oltre a override touchesShouldCancelInContentView
in vista di scorrimento sottoclasse, è comunque necessario delaysContentTouches
insieme a false
. Infine, è necessario tornare true
piuttosto che false
per i pulsanti. Ecco un esempio modificato dal link qui sopra. Come commentatori hanno suggerito, esso controlla per qualsiasi sottoclasse di UIControl
piuttosto che UIButton
appositamente in modo che questo comportamento si applica a qualsiasi tipo di controllo.
Objective-C:
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.delaysContentTouches = false;
}
return self;
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:UIControl.class]) {
return true;
}
return [super touchesShouldCancelInContentView:view];
}
Swift 4:
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIControl {
return true
}
return super.touchesShouldCancel(in: view)
}
Cerca di insieme di proprietà UIScrollView delaysContentTouches
su NO.
In Swift 3:
import UIKit
class ScrollViewWithButtons: UIScrollView {
override init(frame: CGRect) {
super.init(frame: frame)
myInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
myInit()
}
private func myInit() {
self.delaysContentTouches = false
}
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancel(in: view)
}
}
È quindi possibile utilizzare questo ScrollViewWithButtons
in IB o nel codice.
Nessuna delle soluzioni esistenti ha funzionato per me. Forse la mia situazione è più unico.
Ho molti UIButtons
all'interno di un UIScrollView
. Quando si preme un UIButton
una nuova UIViewController
viene presentato all'utente. Se un pulsante viene tenuto premuto abbastanza a lungo, il pulsante mostrerà il suo stato di depressione. Il mio cliente si lamentava che se si tocca troppo in fretta, nessuno stato depresso è mostrato.
La mia soluzione:
All'interno del UIButtons
' metodo di rubinetto, in cui si carica il nuovo UIViewController
e presente sullo schermo, io uso
[self performSelector:@selector(loadNextScreenWithOptions:)
withObject:options
afterDelay:0.]
Questa orari del carico del prossimo UIViewController
sul prossimo ciclo di eventi. tempo per il UIButton
per ridisegnare permettendo. La UIButton
ora mostra il suo stato di depressione prima di caricare il successivo UIViewController
.
Swift 3:
scrollView.delaysContentTouches = false