27

UIScrollView の垂直方向のバウンスを無効にする方法を探していましたが、下部のみです。私はまだトップでバウンスが必要です。

何も見つかりませんでした。これは可能ですか?

前もって感謝します!

4

7 に答える 7

56

UIScrollViewDelegateメソッドscrollViewDidScrollを使用して、スクロールビューのコンテンツオフセットを確認し、ユーザーがスクロールビューの下限を超えてスクロールしようとしているかどうかを多かれ少なかれ確認します。次に、これを使用して、スクロールをスクロールビューの最後に戻します。それは非常に急速に起こるので、スクロールビューがその境界を超えて跳ね返ったり伸びたりしたことすらわかりません。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y >= scrollView.contentSize.height - scrollView.frame.size.height) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, scrollView.contentSize.height - scrollView.frame.size.height)];
    }
}
于 2012-12-29T18:36:35.607 に答える
12

Swift で上部の垂直バウンスを無効にするには:

func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 {
        scrollView.contentOffset.y = 0
    }
}

Swift で下部の垂直バウンスを無効にするには:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > scrollView.contentSize.height - scrollView.bounds.height {
        scrollView.contentOffset.y = scrollView.contentSize.height - scrollView.bounds.height
    }
}
于 2016-01-27T22:13:01.537 に答える
4

0x7fffffff の回答に基づいて、クラスを作成しました。

VerticalBounceControl.h

#import <UIKit/UIKit.h>

@interface VerticalBounceControl : NSObject

@property (nonatomic, assign) BOOL bounce;

- (id) initWithScrollView:(UIScrollView*)scrollView bounceAtTop:(BOOL)bounceAtTop bounceAtBottom:(BOOL)bounceAtBottom;

@end

VerticalBounceControl.m

#import "VerticalBounceControl.h"

@interface VerticalBounceControl ()
@property (nonatomic, retain) UIScrollView* scrollView;
@property (nonatomic, assign) BOOL bounceAtTop;
@property (nonatomic, assign) BOOL bounceAtBottom;
@end

@implementation VerticalBounceControl

- (id) initWithScrollView:(UIScrollView*)scrollView bounceAtTop:(BOOL)bounceAtTop bounceAtBottom:(BOOL)bounceAtBottom {
    self = [super init];
    if(self) {
        self.bounce = YES;
        self.scrollView = scrollView;
        self.bounceAtTop = bounceAtTop;
        self.bounceAtBottom = bounceAtBottom;
        [self.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL];
    }
    return self;
}

- (void) dealloc {
    [self.scrollView removeObserver:self forKeyPath:@"contentOffset"];
    self.scrollView = nil;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentOffset"]) {
        if (self.bounce && ((self.scrollView.contentOffset.y<=0 && self.bounceAtTop) || (self.scrollView.contentOffset.y>=self.scrollView.contentSize.height-1 && self.bounceAtBottom))) {
            self.scrollView.bounces = YES;
        } else {
            self.scrollView.bounces = NO;
        }
    }
}

@end

UIScrollViewこれは、呼び出し元が次のようなデリゲートでなくても使用できます。

VerticalBounceControl* bounceControl = [[VerticalBounceControl alloc] initWithScrollView:anyScrollView bounceAtTop:YES bounceAtBottom:NO];

UIScrollViewこのようにして、デリゲートを変更したくない sに対してこのバウンス動作を持たせることができます ( のようなUIWebViewもの)。

繰り返しになりますが、解決策を提供してくれた @0x7ffffffff に感謝します。

于 2012-12-29T19:18:16.700 に答える
0

fabsf()負の(下向きの)スクロールにも対応するために、0x7ffffffff♦のソリューションに追加しました。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (fabsf(scrollView.contentOffset.y) >= scrollView.contentSize.height - scrollView.frame.size.height) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, scrollView.contentSize.height - scrollView.frame.size.height)];
    }
}
于 2014-09-26T07:19:10.963 に答える