2011-11-03 4 views
2

私はUIScrollviewからUIImageviewをドラッグする必要があるアプリケーションを開発しています。 私の主なUIViewの一番下の部分には、内部にUIImageViewsを持つUIScrollViewがあります。私は私のPuzzleViewControllerでCustomScrollオブジェクトを含まれ、インターフェイスビルダーのscrollviewに接続している。ここからiphone-UIScrollview対角線スワイプ予期しない動作

@interface CustomScroll : UIScrollView { 

}@end 


@implementation CustomScroll 


- (id)initWithFrame:(CGRect)frame { 
return [super initWithFrame:frame]; 

} 

- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event { 
// If not dragging, send event to next responder 
if (!self.dragging) { 
    self.scrollEnabled=NO; 
    [self.nextResponder touchesMoved:touches withEvent:event]; 

} 
else{ 
    [super touchesMoved: touches withEvent: event]; 
} 

}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event { 
// If not dragging, send event to next responder 
if (!self.dragging) 
    [self.nextResponder touchesEnded: touches withEvent:event]; 
else 
    [super touchesEnded: touches withEvent: event]; 
} 
@end 

私は次のコードスニペットを使用してカスタムUIScrollViewのを作成している
@interface PuzzleViewController : UIViewController <UIScrollViewDelegate> { 
    IBOutlet CustomScroll *segmentScrollview; 

}

IすべてのUIImageviewsをプログラムで追加しました。

このコードは期待どおりに機能しています。 UIImageviewはタッチを検出し、UIIcageviewからUIViewにUIImageviewをドラッグできます。

しかし、UIImageviewを斜めにドラッグすると問題が発生します。

私のアプリでUIImageViewをscrollviewから垂直にドラッグすると、UIIcageViewをUIViewに移動することができます。しかし、UIImageviewをスクロールビューから斜めにドラッグするとUIImageviewを動かすことはできません。対角線のスワイプスクロールUIScrollview [UIImageviewは変更されません]これは予期せぬものです。私はUIImageviewをUIScrollviewから斜めにドラッグする必要があります。

ご協力いただければ幸いです。

ご協力いただきありがとうございます。

答えて

1

これは単なる考えです。それを試してみて、それがどうなっているか教えてください。もしうまくいかなければ、私はあなたをさらに助けようとします。 directionalLockEnabledをNOに設定してみてください。 YESに設定すると、動きは水平/垂直のみに制限されます。 NOに設定すると、斜めに移動できるはずです。試してみて、それがどうなっているか教えてください。

UIScrollView directionLockEnabled Docs

このプロパティがNOであれば、スクロールは、水平及び 垂直方向の両方に許可されています。 このプロパティがYESで、ユーザーが を1つの一般的な方向(水平または垂直方向)にドラッグすると、 スクロールビューでは、他の方向のスクロールが無効になります。矢印 の方向が斜めの場合、スクロールはロックされず、ユーザー はドラッグが完了するまで任意の方向にドラッグできます。デフォルト値 は、私が何をした後ですがないことを考えていますNO

+0

あなたの返信には、サムとPTBGありがとうございます。しかし、directionalLockEnabledは機能しません。問題はそのままです。私はUIImageviewをscrollviewから斜めにドラッグすることはできません。 – user392406

0

ではありません[スーパーtouchesMoved:...]のではなく、[self.superview touchesMoved:...] ...あなたが持っていると仮定しますあなたがこれに対処するためにセットアップしようとしているCustomScrollと他のビューの両方を含むスーパービュー。

0

これは古い質問ですが、この問題にも遭遇しました。基本的には、ページングが有効になっているスクロールビューを、上下、左右、または右に移動したいと思っていました。 pagingEnabledおよびdirectionalLockEnabled変数を使用すると、基本的に対角線のドラッグを除いて機能します。私の解決策は以下の通りです。唯一の方法はスクロールアップしたりダウンが正確に上下にスワイプすることであろうよう

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (self.scrollView.contentOffset.x >= self.previousScrollOffset.x && 
     self.scrollView.contentOffset.y == self.scrollView.contentSize.height/3){ 

     self.currentScrollDirection = SW_DIRECTION_LEFT; 

    } else if (self.scrollView.contentOffset.x < self.previousScrollOffset.x && 
       self.scrollView.contentOffset.y == self.scrollView.contentSize.height/3){ 

     self.currentScrollDirection = SW_DIRECTION_RIGHT; 

    } else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width/3 && 
     self.scrollView.contentOffset.y >= self.previousScrollOffset.y){ 

     self.currentScrollDirection = SW_DIRECTION_UP; 

    } else if (self.scrollView.contentOffset.x == self.scrollView.contentSize.width/3 && 
     self.scrollView.contentOffset.y <= self.previousScrollOffset.y){ 

     self.currentScrollDirection = SW_DIRECTION_DOWN; 

    } else { 

     self.currentScrollDirection = SW_DIRECTION_NONE; 

    } 

    //lock to either horizontal or vertical if we are dragging (prevent the diagonal drag) 
    if (self.scrollView.isTracking && self.currentScrollDirection == SW_DIRECTION_NONE){ 
     self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentSize.height/3); 
    } 

    self.previousScrollOffset = scrollView.contentOffset; 
} 

これは、水平ドラッグが優先だったので、私のためによく働い水平面上のスクロールをロックするために、任意の斜めのスワイプを強制的に。あなたが} SW_SCROLL_DIRECTIONを

@property (readwrite, nonatomic) SW_SCROLL_DIRECTION currentScrollDirection; 
@property (readwrite, nonatomic) CGPoint previousScrollOffset; 

typedef enum { 
SW_DIRECTION_NONE, 
SW_DIRECTION_LEFT, 
SW_DIRECTION_RIGHT, 
SW_DIRECTION_UP, 
SW_DIRECTION_DOWN 

を宣言する必要があります。これが機能するために

注。あなたが3ページの値をハードコードするのを見ると、これはおそらく箱から出てきません。これは、コンテンツが常に中央に配置されているため、いずれの方向にも1ページをスクロールしてから、中央にアニメーション表示されるためです。複数のページで作業するために変更するのは難しいことではありません。