2011-12-04 12 views
8

Estoy intentando limitar el área de deslizamiento del UIScrollview, pero no puedo hacerlo.UIScrollview limit swipe area

Me gustaría establecer el área de deslizamiento solo en la parte superior de UIScrollview, pero me gustaría establecer todo el contenido visible.

Actualización:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] > 0) { 
     UITouch *tempTouch = [touches anyObject]; 
     CGPoint touchLocation = [tempTouch locationInView:self.categoryScrollView]; 
     if (touchLocation.y > 280.0) 
     { 
      NSLog(@"enabled"); 
      self.categoryScrollView.scrollEnabled = YES; 
     } 
    } 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// [super touchesEnded:touches withEvent:event]; 
    self.categoryScrollView.scrollEnabled = YES; 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

Solución: No se olvide de establecer delaysContentTouches a NO en el UIScrollView

self.categoryScrollView.delaysContentTouches = NO; 
+0

¡Bonito! 2 años después me ayudaste: P – NSPunk

Respuesta

7

Puede desactivar el desplazamiento en el UIScrollView, anular touchesBegan:withEvent: en su controlador de vista, comprobar si cualquiera de los toques comenzó en el área donde le gustaría habilitar los deslizamientos, y si la respuesta es 'sí', vuelva a habilitar el desplazamiento. También anule touchesEnded:withEvent: y touchesCancelled:withEvent: para deshabilitar el desplazamiento cuando finalicen los toques.

+0

Hola, algo salió mal. El deslizamiento solo se habilita después de que el toque finalizó, no durante la fase de toque actual :( –

+0

@ ViskyMáté No estaba seguro de que funcionaría, pero creo que valió la pena intentarlo. Otra cosa que probar sería mantener el desplazamiento habilitado , deshabilítelo en 'touchesMoved: withEvent:' si están fuera del área, y vuelva a habilitar el desplazamiento en '' touchesEnded'/'touchesCancelled'. – dasblinkenlight

+0

Se comenzó a trabajar, pero :(no funciona todo la hora. Hay una pequeña demora antes de que comience el TouchBegin/Cancel/Moved, por eso si estoy pellizcando rápido, no funciona, en cualquier otro momento está funcionando. Si me puede ayudar a desactivar este retraso (i no sé dónde está eso) que sería genial, y la solución exitosa –

4

This blog post muestra una forma muy simple y limpia de implementar la funcionalidad.

// init or viewDidLoad 

    UIScrollView *scrollView = (UIScrollView *)view; 
    _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init]; 
    _scrollViewPanGestureRecognzier.delegate = self; 
    [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier]; 

// 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer 
{ 
return NO; 
} 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer == _scrollViewPanGestureRecognzier) 
    { 
    CGPoint locationInView = [gestureRecognizer locationInView:self.view]; 
    if (locationInView.y > SOME_VALUE) 
    { 
     return YES; 
    } 
    return NO; 
    } 
    return NO; 
} 
4

Otras respuestas no funcionó para mí. Subclases UIScrollView funcionó para mí (Swift 3):

class ScrollViewWithLimitedPan : UIScrollView { 
    // MARK: - UIPanGestureRecognizer Delegate Method Override - 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     let locationInView = gestureRecognizer.location(in: self) 
     print("where are we \(locationInView.y)") 
     return locationInView.y > 400 
    } 
} 
+0

Creo que esta es la manera más "limpia" de ir. –

+0

esto es útil, ¡salud! – jarryd