2010-05-18 15 views

Respuesta

5

Sí ... echa un vistazo a la especificación UIScrollViewDelegate, poner en práctica los métodos, incluyendo los dos de abajo, y establecer delegado de su UIScrollView en consecuencia:

// User stops dragging the table view. 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
    willDecelerate:(BOOL)decelerate; 

// Control slows to a halt after the user drags it 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

Es probable que haya más interesados ​​en scrollViewDidEndDecelerating. También funcionan en UITableView, que es donde originalmente los encontré (UITableView hereda de UIScrollView).

+0

Muchas gracias. Lo sé de esta manera, solo pensé que hay otro método. ¡Gracias! :) –

28

Así es como he detectado si la vista de desplazamiento está rebotando horizontal:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    if (scrollView.contentOffset.x < 0) { 
    NSLog(@"bouncing left"); 
    } 

    if (scrollView.contentOffset.x > (scrollView.contentSize.width - scrollView.frame.size.width)) { 
    NSLog(@"bouncing right"); 
    } 
} 
8

Una pequeña modificación al método de Justin, lo que permite contentInset:

if(scrollView.contentOffset.x < -scrollView.contentInset.left) 
{ 
    NSLog(@"bounce left"); 
} 
if(scrollView.contentOffset.x > scrollView.contentSize.width - scrollView.frame.size.width + scrollView.contentInset.right) 
{ 
    NSLog(@"bounce right"); 
} 
1

Para aquellos de ustedes que sería capaz para "rebotar" hacia abajo en una vista de desplazamiento para actualizar el contenido de la vista. (Y el evento sólo se disparó una vez.)

- (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView 
        willDecelerate:(BOOL)decelerate{ 

    CGPoint offset = aScrollView.contentOffset; 
    CGRect bounds = aScrollView.bounds; 
    CGSize size = aScrollView.contentSize; 
    UIEdgeInsets inset = aScrollView.contentInset; 
    float y = offset.y + bounds.size.height - inset.bottom; 
    float h = size.height; 

    //Distance in points before update-event occur 
    float reload_distance = 50; 
    // 
    if(y > h + reload_distance) { 
     NSLog(@"load more rows"); 
    } 
} 
1

pregunta Viejo pero simplemente se topó con un problema similar y quería añadir que es una buena idea para comprobar también que el contenido vistas de desplazamiento es mayor que el desplazamiento marco de vista:

+ (BOOL) isScrollViewBouncing:(UIScrollView *)scrollView 
{ 
    return scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.frame.size.height 
      && scrollView.contentSize.height > scrollView.frame.size.height; 
} 

Esto ahora se asegura la vista de desplazamiento es suficientemente grande como para estar en un estado de desplazamiento de rebotes, por lo que si el punto de vista de desplazamiento es pequeño, no siempre se evalúa como verdadera.

Saludos

0

Uso de la respuesta de Glavid, que añaden que rebota hacia abajo también, y ha añadido como una categoría

#import "UIScrollView+Additions.h" 

@implementation UIScrollView (Additions) 

- (BOOL)isBouncing 
{ 
    BOOL isBouncingBottom = self.contentOffset.y >= self.contentSize.height - self.frame.size.height 
     && self.contentSize.height >= self.frame.size.height; 
    BOOL isBouncingTop = self.contentOffset.y <= 0; 

    BOOL isBouncing = isBouncingBottom || isBouncingTop; 
    return isBouncing; 
} 

@end 
9

he implementado extensión para UIScrollView manejar esto para el desplazamiento vertical y horizontal. Esto funciona incluso con contentInsets distintos de cero y en el caso cuando el contenido no es lo suficientemente grande como para cubrir ScrollView inserciones:

Objective-C

@interface UIScrollView (Bouncing) 

@property (nonatomic, readonly) BOOL isBouncing; 
@property (nonatomic, readonly) BOOL isBouncingTop; 
@property (nonatomic, readonly) BOOL isBouncingLeft; 
@property (nonatomic, readonly) BOOL isBouncingBottom; 
@property (nonatomic, readonly) BOOL isBouncingRight; 

@end 

@implementation UIScrollView (Bouncing) 

- (BOOL)isBouncing 
{ 
    return self.isBouncingTop || self.isBouncingLeft || self.isBouncingBottom || self.isBouncingRight; 
} 

- (BOOL)isBouncingTop 
{ 
    return self.contentOffset.y < - self.contentInset.top; 
} 

- (BOOL)isBouncingLeft 
{ 
    return self.contentOffset.x < - self.contentInset.left; 
} 

- (BOOL)isBouncingBottom 
{ 
    BOOL contentFillsScrollEdges = self.contentSize.height + self.contentInset.top + self.contentInset.bottom >= CGRectGetHeight(self.bounds); 
    return contentFillsScrollEdges && self.contentOffset.y > self.contentSize.height - CGRectGetHeight(self.bounds) + self.contentInset.bottom; 
} 

- (BOOL)isBouncingRight 
{ 
    BOOL contentFillsScrollEdges = self.contentSize.width + self.contentInset.left + self.contentInset.right >= CGRectGetWidth(self.bounds); 
    return contentFillsScrollEdges && self.contentOffset.x > self.contentSize.width - CGRectGetWidth(self.bounds) + self.contentInset.right; 
} 

@end 

Swift 3.0+

extension UIScrollView { 
    var isBouncing: Bool { 
    return isBouncingTop || isBouncingLeft || isBouncingBottom || isBouncingRight 
    } 
    var isBouncingTop: Bool { 
    return contentOffset.y < -contentInset.top 
    } 
    var isBouncingLeft: Bool { 
    return contentOffset.x < -contentInset.left 
    } 
    var isBouncingBottom: Bool { 
    let contentFillsScrollEdges = contentSize.height + contentInset.top + contentInset.bottom >= bounds.height 
    return contentFillsScrollEdges && contentOffset.y > contentSize.height - bounds.height + contentInset.bottom 
    } 
    var isBouncingRight: Bool { 
    let contentFillsScrollEdges = contentSize.width + contentInset.left + contentInset.right >= bounds.width 
    return contentFillsScrollEdges && contentOffset.x > contentSize.width - bounds.width + contentInset.right 
    } 
} 
Cuestiones relacionadas