Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-10-02

UIScrollViewを絶対に斜めにスクロールさせない方法

| 14:52 | はてなブックマーク -  UIScrollViewを絶対に斜めにスクロールさせない方法 - iPhoneアプリ開発まっしぐら★

UIKit本追加/補足 > UIKit本の内容自体への補足/訂正 > UIScrollViewを絶対に斜めにスクロールさせない方法


UIScrollViewにはdirectionalLockEnabledというプロパティがあり、ここにYESを設定すると、上下にスクロールしはじめたら上下固定、左右にスクロールしはじめたら左右に固定となるため、斜めにスクロールできないようにしたい場合に便利です。

しかし、これには重大な欠陥(仕様?)があり、はじめから斜めにスクロールしはじめると斜めにスクロールできてしまうのです*1

そのため、斜めに絶対にスクロールさせないためには、自分で制御しなければなりません。


具体的には、以下のストーリーで制御を行ないます。

1. スクロール前のスクロール位置を保存しておく
2. スクロールしはじめたら、それが上下方向か左右方向かを判別して記憶する
3. 上下方向なら、それ以降のスクロールで左右に移動してしまったぶんを無理やり元に戻す
4. 左右方向なら、それ以降のスクロールで上下に移動してしまったぶんを無理やり元に戻す

スクロールの検知はUIScrollViewDelegateのscrollViewDidScroll:メソッド、スクロール位置の矯正はUIScrollViewのsetContentOffset:メソッド*2でそれぞれ行ないます。


具体的なコードは以下のとおり。

これをUIScrollViewを継承したクラスかUIScrollViewを管理しているクラスに追記します。

【interface側】

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

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

【implementation側】

@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;
      }
    }
  }
  if ( kILScrollViewDirectionVertical == self.direction ) {
      currentPoint.x = self.beganPoint.x;
      [scrollView setContentOffset:currentPoint];
  } else if ( kILScrollViewDirectionHorizontal == self.direction ) {
      currentPoint.y = self.beganPoint.y;
      [scrollView setContentOffset:currentPoint];
  }
}

この他、UIScrollViewDelegateには、

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

で、慣性のアニメーションも含めてスクロールが完全に終わるのを検知する機能なども備わったりしています。

*1:iOS4.1現在

*2:contentOffsetプロパティ

DiosmaryDiosmary 2012/02/07 02:19 I feel saistfied after reading that one.

afkzorrxsliafkzorrxsli 2012/02/07 17:36 YwRFJD <a href="http://hfvnyjmaylup.com/">hfvnyjmaylup</a>

ryzvrizlxryzvrizlx 2012/02/09 20:49 YePVl1 , [url=http://ilafqvobogzb.com/]ilafqvobogzb[/url], [link=http://extouivsybdi.com/]extouivsybdi[/link], http://xivfvtxrgpua.com/

omjjiaxomjjiax 2012/02/11 02:20 GJQx3W <a href="http://vxlrpnigxovg.com/">vxlrpnigxovg</a>

czzqjeuczzqjeu 2012/02/12 03:44 rtKW1V , [url=http://dtzinzwejddp.com/]dtzinzwejddp[/url], [link=http://tabyjeeqfmpb.com/]tabyjeeqfmpb[/link], http://hpmxkcvmlqes.com/

CharlieCharlie 2013/10/13 10:57 Thinking like that is really imvisserpe

MarijanaMarijana 2013/10/14 14:21 You've hit the ball out the park! Inebcdirle!

KatrinaKatrina 2013/10/15 04:02 You <a href="http://ztpyupaomw.com">co'ulndt</a> pay me to ignore these posts!

StivenStiven 2013/10/15 15:38 That's a wise answer to a tricky quitseon http://jrqfcy.com [url=http://cvnkfkniwt.com]cvnkfkniwt[/url] [link=http://nlqktxnjnah.com]nlqktxnjnah[/link]

KahlouchaKahloucha 2013/11/03 18:13 Kewl you should come up with that. <a href="http://uacatmwe.com">Exltlcene!</a>

SluxzSluxz 2013/11/12 23:30 Check that off the list of things I was <a href="http://ynmgjzxubtd.com">coeunsfd</a> about.

ElenaElena 2013/11/14 12:03 At last, soenome who comes to the heart of it all http://hkvjrzl.com [url=http://vfqzwh.com]vfqzwh[/url] [link=http://wzkeisopfj.com]wzkeisopfj[/link]

HeberHeber 2013/11/16 03:22 That's a brilliant answer to an <a href="http://imsxwdeie.com">intsreeting</a> question

ToshihideToshihide 2013/11/18 02:51 I'm quite pleased with the inorfmation in this one. TY! http://pvoitao.com [url=http://ykoqymm.com]ykoqymm[/url] [link=http://ifhsrbz.com]ifhsrbz[/link]

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/tokorom/20101002