Il mio problema era un superset di questo problema - ho UISliders all'interno UITableViewCells e tutta l'UITableView è una pagina all'interno di un UIScrollView. I cursori stavano devastando le interazioni con gli altri due e le soluzioni di sottoclassi non funzionavano. Ecco che cosa è venuto fuori che funziona benissimo: invia notifiche quando i cursori si muovono e UITableView e UIScrollView disabilitano il cronometraggio durante questo periodo. Nota nell'immagine qui sotto: i miei cursori sono orizzontali, il mio tableview è verticale e il mio UIScrollView ha pagine orizzontali.
 
L'UITableViewCell raccoglie gli eventi per il cursore di programmazione creato:
self.numberSlider = [[UISlider alloc] init];
[self.numberSlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.numberSlider addTarget:self action:@selector(sliderTouchDown:) forControlEvents:UIControlEventTouchDown];
[self.numberSlider addTarget:self action:@selector(sliderTouchUp:) forControlEvents:UIControlEventTouchUpInside];
[self.numberSlider addTarget:self action:@selector(sliderTouchUp:) forControlEvents:UIControlEventTouchUpOutside];
Ai fini di questo tutorial, ci interessa solo touchdown e Up:
- (void)sliderTouchDown:(UISlider *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
}
- (void)sliderTouchUp:(UISlider *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
Ora rileviamo queste notifiche sia in UITableView (si noti che il tableview è in un VC ma sono sicuro che funzionerebbe se si sottomette assed):
- (void)viewDidLoad
{
// other stuff
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sliderTouchDown:) name:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sliderTouchUp:) name:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
- (void)sliderTouchDown:(NSNotification *)notify
{
self.treatmentTableView.scrollEnabled = NO;
}
- (void)sliderTouchUp:(NSNotification *)notify
{
self.treatmentTableView.scrollEnabled = YES;
}
e UIScrollView (come sopra, racchiusa in un VC):
- (void)viewDidLoad
{
// other stuff
// Register for slider notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableScrolling:) name:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enableScrolling:) name:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
- (void)disableScrolling:(NSNotification *)notify
{
self.scrollView.scrollEnabled = NO;
}
- (void)enableScrolling:(NSNotification *)notify
{
self.scrollView.scrollEnabled = YES;
}
Mi piacerebbe sentire una soluzione più elegante, ma questo certamente ottiene il lavoro fatto . Quando si utilizza un dispositivo di scorrimento, la tabella e le visualizzazioni di scorrimento rimangono ferme e quando si fa clic all'esterno dei cursori, la vista tabella e le visualizzazioni di scorrimento si spostano come previsto. Inoltre, nota che potrei usare istanze non sottoclasse di tutti e 3 i componenti in questa soluzione. Spero che questo aiuti qualcuno!
fonte
2014-01-22 00:43:16
Grazie, ho finito per andare con quello. Tuttavia, un'altra stranezza ... questo comportamento sembrava solo manifestarsi sul simulatore. Una volta ottenuto sul dispositivo ha funzionato bene senza la correzione. – MarkPowell
Interessante, un'altra ragione per non fare affidamento solo sul simulatore per testare ... – BoltClock
FWIW, sto vedendo esattamente lo stesso comportamento (come descritto nella domanda originale) sia su simulatore (iOS 6) che su dispositivo (iOS 5.1). Devo toccare e tenere premuto un attimo prima di trascinare il cursore, altrimenti otterrò il trascinamento della vista di scorrimento. –