2012-06-12 8 views
10

Ich habe einen (vertikalen) UISlider in einem UIScrollview. Ich möchte den Wert des Schiebereglers ändern können und ohne den Finger zu bewegen, den Bildlauf nach links oder rechts scrollen.Touch on UISlider verhindert das Scrollen von UIScrollView

Wunschverhalten:

Touch-Down innere vertikale UISlider, mit einem Finger ziehen gefolgt links oder rechts bewirkt, dass die Scroll

tatsächliches Verhalten blättern:

Berühren Sie nach unten innen vertikalen UISlider , gefolgt von einem Finger ziehen nach links oder rechts verursacht keine Bewegung in UIScrollview. Eine Berührung außerhalb der UISlider, gefolgt von einem Ziehen wird den Bildlauf wie erwartet scrollen

UIView hat eine Eigenschaft namens exklusiveTouch, die scheint, als ob es mit meinem Problem verbunden sein könnte. Ich habe versucht, es auf NEIN zu setzen, ohne Glück.

Also, wie können meine UISliders eingerichtet werden, so dass der Scrollview unter ihnen auf Berührungen reagieren wird, die innerhalb der UISliders entstehen?

+5

+1 für das gewünschte/erwartete Ergebnis im Vergleich zum tatsächlichen Ergebnis. Weitere Fragen sollten dies tun. –

Antwort

4

Haben Sie versucht, Unterklassen UIScrollView und implementieren - (BOOL)touchesShouldCancelInContentView:(UIView *)view?Laut der Apple-Dokumentation:

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

Wenn Sie einfach NO zurück, wenn die view Ihre UISlider, diese kann ist tun, was Sie wollen, vorausgesetzt, Ihr UIScrollView nur horizontal scrollt. Wenn dies nicht funktioniert, müssen Sie wahrscheinlich benutzerdefinierte Touch-Behandlung (dh touchesBegan:withEvent:, touchesChanged:withEvent:, etc.) für Ihre UIScrollView und Ihre UISlider tun.

+0

Hat den Trick gemacht. Vielen Dank! – morgancodes

2

Was Sie sehen, ist das beabsichtigte Verhalten.

Jedes Berührungsereignis wird nur von einem Steuerelement behandelt. Was exclusiveTouch tut ist eigentlich zu verhindern, dass andere Berührungsereignisse an andere Ansichten geliefert werden.

Um zu tun, was Sie tun möchten, müssen Sie die Berührung selbst erledigen. Übergeben Sie das Ereignis an beide Ihre Ansichten. Sie können dies entweder tun, indem Sie alle Methoden touchesBegan:, touchesMoved: usw. implementieren und die Ereignisse an beide Ansichten übergeben. Sie können mehr über diesen Ansatz in der UIResponder documentation lesen. Ein anderer Ansatz besteht darin, die Ereignisbehandlung in einem UIGestureRecognizer in der Bildlaufansicht durchzuführen, die den Schieberegler testet und den Wert des Schiebereglers mithilfe des Y-Deltas aktualisiert. Sie können mehr über Gestenerkenner und Ereignisbehandlung in the section about Gesture Recognizers in the Event Handling Guide for iOS lesen.


Exkurs:

Gehen Sie auf die App Einstellungen und schalten Sie einen Schalter auf halbem Weg (zum Beispiel den Flugmodus umschalten) und dann nach unten ziehen. Nichts wird passieren. Der Rest des Betriebssystems verhält sich auf die gleiche Weise. Sind Sie sicher, dass dies die Interaktion ist, die Sie wirklich tun möchten? Apps, die sich anders verhalten, fühlen sich oft komisch und fremd an.

+0

+1 für "Um zu tun, was Sie tun möchten, müssen Sie sich selbst berühren." – morgancodes

+0

@morgancodes Ja, wahrscheinlich ein bisschen zu vage. Ich habe zwei grundlegende Alternativen und Links zu relevanten Dokumentationen hinzugefügt, um Ihre eigene Touch-Handhabung zu machen. –

1

Ihre Frage verwirrte mich ein wenig. Sie sagen einen vertikalen Schieberegler - aber nach links und rechts ziehen?

Wenn Sie die Scrollview zu scrollen, wenn die UISlider, um die richtige Art und Weise ziehen zu tun ist, so

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

und

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

Hoffnung das ist, was Sie wollen.

+0

Vielen Dank für Ihre Antwort, aber das ist nicht, was ich frage. Ich versuche herauszufinden, wie das touchesMoved-Ereignis auf die UIScrollview angewendet werden kann, nicht nur das UISlider in der scrollview. Ich möchte einen vertikalen Ziehvorgang, um den Wert des Schiebereglers zu ändern, und einen horizontalen Ziehvorgang, um die Position des UIScrollview zu ändern, so wie es wäre, wenn kein vertikaler Schieberegler im Weg wäre. – morgancodes

0

Ich denke, Sie können eine Referenz von this erhalten Beispiel in diesem Beispiel wird gezeigt, wie Sie jede Berührung oder jede Gestenerkennung abbrechen und sie auf andere Ansichten anwenden können.

Dies kann dazu führen Sie zur Lösung des Problems und wenn es nur lassen Sie mich wissen es

Glückliche Codding :)

1

Sie müssen delayscontenttouches als NO einzustellen und zu verhindern, für UISlider Objekte blättern , Überprüfen Sie den folgenden Code.

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
} 
Verwandte Themen