UIScrollView の垂直方向のバウンスを無効にする方法を探していましたが、下部のみです。私はまだトップでバウンスが必要です。
何も見つかりませんでした。これは可能ですか?
前もって感謝します!
UIScrollView の垂直方向のバウンスを無効にする方法を探していましたが、下部のみです。私はまだトップでバウンスが必要です。
何も見つかりませんでした。これは可能ですか?
前もって感謝します!
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)];
}
}
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
}
}
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 に感謝します。
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)];
}
}