UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する | iPhoneのある日常

UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する

UIScrollViewでスワイプによる上下スクロールを禁止する or 左右スクロールを禁止する

UIScrollViewを絶対に斜めにスクロールさせない方法 | iPhoneアプリ開発まっしぐら★



上記サイト様で斜めスクロールの禁止方法はできるのですが、縦横の禁止はできません。

なにがしたいのかというと、iPhone4の解像度は960x640なわけですが、

960x1280の画像を用意してきた場合、縦方向のスクロールをしたところで特になにがあるわけでもないので

できればスクロールさせたくないわけです。

上記サイト様のコードをほんの少しいじるだけですが、忘備録として記録しておこうと思います。



.h側
typedef enum
{
kILScrollViewDirectionNone = 0,
kILScrollViewDirectionHorizontal = 1,
kILScrollViewDirectionVertical = 2,
} ILScrollViewDirection;

@property (nonatomic, assign) ILScrollViewDirection direction;
@property (nonatomic, assign) CGPoint beganPoint;

        .m側
@synthesize direction = direction_;
@synthesize beganPoint = beganPoint_;

// スクロール管理の初期化
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView {
self.direction = kILScrollViewDirectionNone;
// スクロールしはじめのoffset管理
self.beganPoint = [scrollView contentOffset];
}

// スクロール位置の矯正
- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
CGPoint currentPoint = [scrollView contentOffset];
if ( kILScrollViewDirectionNone == self.direction ) {
// スクロール方向の決定
if ( !CGPointEqualToPoint( currentPoint, self.beganPoint ) ) {
CGFloat moveHorizontal = ABS( currentPoint.x - self.beganPoint.x );
CGFloat moveVertical = ABS( currentPoint.y - self.beganPoint.y );
if ( moveHorizontal < moveVertical ) {
NSLog( @"direction = Vertical" );
self.direction = kILScrollViewDirectionVertical;
} else {
NSLog( @"direction = Horizontal" );
self.direction = kILScrollViewDirectionHorizontal;
}
}
}

currentPoint.y = self.beganPoint.y;
[scrollView setContentOffset:currentPoint];

}
ぶっちゃけ最後の if~else if の部分を外して、強制的に縦固定させただけです。
ですので、「.y」の部分を「.x」に変更することで左右スクロールをさせないことも可能です。

また、本家様の[if~else if]部分を書き換えることで、横方向にスワイプされた時はスクロール・縦方向にスクロールされた時は表示の更新、といった機能を実装することが可能となります。

(↑試してないので、うまく行かない場合は申し訳ありませんm(_ _)m)



また一歩前進。