Frage

Wie kann ich testen, ob die Bildlaufansicht springt? Gibt es eine Benachrichtigung oder etwas, wenn der Absprung endet?

War es hilfreich?

Lösung

Ja ... Schauen Sie sich die Spezifikation von UiscrollViewDelegate an, implementieren Sie die Methoden einschließlich der beiden unten und setzen Sie den Delegierten Ihres UiscrollView entsprechend:

// 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;

Sie werden wahrscheinlich am meisten an ScrollviewDidenddecelerating interessiert sein. Diese funktionieren auch in UableView, wo ich sie ursprünglich gefunden habe (Uitableview erbt von UiscrollView).

Andere Tipps

So entdeckte ich, ob die Bildlaufansicht horizontal abprallt:

- (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");
  }
}

Ich habe eine Erweiterung für UiscrollView implementiert, um dies für vertikale und horizontale Scrollen zu verarbeiten. Dies funktioniert auch bei Inhaltssätzen von ungleich Null und falls der Inhalt nicht groß genug ist, um Scrollview-Einsätze abzudecken:

Ziel 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
  }
}

Zum Rxswift Sie können einfach kartieren scrollViewDidScroll mit isBouncing und filtern mit distinctUntilChanged.

Eine geringfügige Änderung der Methode von Justin, die ContentInset ermöglicht:

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" );
}

Alte Frage, aber ich bin gerade auf ein ähnliches Problem gestoßen und wollte hinzufügen, dass es eine gute Idee ist, auch zu überprüfen, ob der Inhalt der Scroll -Ansichten größer ist als der Bild der Scroll -Ansicht:

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

Dies stellt nun sicher, dass die Bildlaufansicht groß genug ist, um sich in einem Bildlauf-Buncing-Zustand zu befinden. Wenn die Bildlaufansicht klein ist, bewertet sie nicht immer auf True.

Prost

Für diejenigen unter Ihnen, die in einer Scrollview nach unten "springen" könnten, um den Inhalt der Ansicht zu aktualisieren. (Und die Veranstaltung wird nur einmal abgefeuert.)

- (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");
    }
}

Mit der Antwort von Glavid fügte ich auch das Abprall nach unten hinzu und fügte als Kategorie hinzu

#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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top