2013-06-19 6 views
11

ich eine PageViewController haben, die wie folgt initialisiert:UISlider innen UIPageViewController

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll 
          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

Auf einer der Seiten, gibt es eine UISlider.

Mein Problem ist, dass wenn ich transitionstyle auf UIPageViewControllerTransitionStyleScroll gesetzt habe, dauert es 150-200 ms bevor beginTrackingWithTouch auf dem Schieberegler aufgerufen wird. Dieses Verhalten wird nicht angezeigt, wenn ich UIPageViewControllerTransitionStylePageCurl verwende, wo der UISlider sofort ausgewählt wird.

Dies bedeutet, dass wenn der Benutzer ein wenig wartet, bevor er den Schieberegler (ein Video-Fortschritt) zieht, die Seite stattdessen dreht, was weit von ideal ist.

Die Page Curl-Animation entspricht nicht den Anforderungen der App, daher wird jede Erklärung oder Problemumgehung geschätzt.

Antwort

16

Da mit UIPageViewControllerTransitionStyleScroll Geste Erkenner nicht verfügbar ist, können Sie diese verwenden:

for (UIView *view in pageViewController.view.subviews) { 
    if ([view isKindOfClass:[UIScrollView class]]) { 
     UIScrollView *scrollView = (UIScrollView *)view; 
     scrollView.delaysContentTouches = NO; 
    } 
} 
+1

Ja, das hat super funktioniert! Einfach und effektiv. – Camputer

+0

Hallo, ich verstehe nicht, wie man diese Lösung benutzt ... Könntest du ein bisschen mehr entwickeln, wo du diesen Code hinzufügen kannst, und warum das Einstellen von delaysContentTouches in der scrollView funktioniert? Danke –

+0

Sie können diesen Code in die nächste Zeile setzen, nachdem Sie Ihren UIPageViewController erstellt haben. Oder Sie können UIPageViewController von der Unterklasse ableiten und diesen Code in die viewDidLoad-Methode einfügen. Verwenden Sie einfach 'self' anstelle von 'pageViewController'. Wenn 'delaysContentToushes' auf 'NO' gesetzt ist, wird der Bildlauf vorwärts sofort auf den Inhalt angewendet und nicht versucht, einen Bildlauf durchzuführen, bevor die Inhaltsmarkierungen berührt werden. –

0

Sie können versuchen, die Delegierten der Seite View-Controller-Gesten auf die Root-Ansicht-Controller zu setzen:

for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) { 
    gestureRecognizer.delegate = self; 
} 

Und dann die Berührung der Gesten zu verhindern, wenn es in UISlider erscheint, die eine Unterklasse von UIControl ist:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    return ([touch.view isKindOfClass:[UIControl class]] == NO); 
} 
+0

Problem ist Gestenerkenner nicht gesetzt, wenn transitionstyle = UIPageViewControllerTransitionStyleScroll, daher diese Frage: [link] (http://stackoverflow.com/questions/13103613/uipageviewcontroller-returns-no-gesture-recognizers-in-ios-6) –

0

ich dieses Problem gelöst durch eine pan Geste auf UISlider hinzufügen und:

self.sliderGesture.cancelsTouchesInView = NO; // make touch always triggered 

und Delegatmethode wie implementieren:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return otherGestureRecognizer.view.superview == self.parentViewController.view; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    // only receive touch in slider 
    CGPoint touchLocation = [touch locationInView:self.view]; 
    return CGRectContainsPoint(self.slider.frame, touchLocation); 
} 
0

Was ich pan-Geste-Erkennungs zu UIView hinzuzufügen geholfen war was hält UISlider, so am Ende habe ich UIPageViewController-> UIScrollView -> ...-> MyView-> UISlider Die 'MyView' Sache hatte Schwenk Geste registriert, die nichts getan, aber gedient, nur um Ereignisse nicht zu verbreiten Bildlaufansicht.