2011-06-23 35 views
0

私のアプリに少し問題があります。私は私のアプローチに疑問を呈しています。UIViewタッチの問題/質問

は、ここで基本的に私は、透明な箱でスピンするカラーホイールを必要とする画像Sample App

です。私がこれまでにしてきたことが働いています。私はカラーホイールをドラッグすることができ、それは回転します。問題は画面上のどこにでも触れてドラッグすることができ、回転することです。私はそれを 'ウィンドウ'内で回転させたいだけです。

基本的にUIViewとUIImageViewを追加し、アウトレットをImageViewに追加し、touchesBeganとtouchesMovedにコードを追加してアニメーションを実行しました。ホイールはフルサークル画像で、サブビューは画像の下半分を表示しないように「クリップ」されています。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *thisTouch = [touches anyObject]; 
    delta = [thisTouch locationInView:wheelImage]; 

    float dx = delta.x - wheelImage.center.x; 
    float dy = delta.y - wheelImage.center.y; 
    deltaAngle = atan2(dy,dx); 

    initialTransform = wheelImage.transform; 
    } 

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [touches anyObject]; 
    CGPoint pt = [touch locationInView:wheelImage]; 

    float dx = pt.x - wheelImage.center.x; 
    float dy = pt.y - wheelImage.center.y; 
    float ang = atan2(dy,dx); 

    //do the rotation 
    if (deltaAngle == 0.0) { 
    deltaAngle = ang; 
    initialTransform = wheelImage.transform; 
    }else 
    { 
    float angleDif = deltaAngle - ang; 
    CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif); 
    wheelImage.transform = newTrans; 

    currentValue = [self goodDegrees:radiansToDegrees(angleDif)]; 

    } 

    } 

今...私の質問は、以下の通りである:

  1. どのように私はtouchesMovedを得ることができます/ UIViewのかUIImageView上で動作するようにONLY始めましたか?
  2. このホイールのカスタムUIViewを作成してメインビューコントローラに追加するだけですか? 2.a.私が習慣を作ったら、私は触れて同じ問題を抱えていますか?

答えて

2

UISwipeGestureRecognizerを使用して、スワイプを認識したいビューにのみ追加することを検討してください。

+0

私は認識装置を追加しました。 UIImageViewだけで動作しているようですね。アニメーションだけで遊ぶ必要があります。私がtouchedMovedと同じコードを使用すると、非常に不安定になります。どのくらいの頻度で発火したかを知るためには、スワイプごとに1回だけ認識機能を調べる必要があります。 – jdruid

+0

ええと、UIPanGestureRecognizerは、視点を横切って正確に指を追跡するので、あなたのケースではよりうまくいくかもしれません。 – Jamie

+0

私は現在、スワイプを使用しています。私はそれが素晴らしい仕事を得た。私がクリエイティブを落とすと、私はパンに戻って、それがどのように機能するか見ることができます。リードしてくれてありがとう! – jdruid

1

UIImageViewをサブクラス化してそのコードを入力すると、そのビューからの操作だけが得られます。おそらくacceptsUserInteractionをYESに設定する必要があります。また、locationInView:をselfに変更します。ペン先からロードする場合は、クラスをそのUIImageViewの新しいサブクラスに設定してください。

2

簡単な解決策は、タッチがお好きな地域で始めたときtrueに設定されているBOOL VAR追加することです:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *thisTouch = [touches anyObject]; 
    CGPoint p = [thisTouch locationInView:wheelImage.superview]; 
    if (CGRectContainsPoint(wheelImage.frame, p)) 
    { 
     rotating = YES; 
     // rest of your code 
     ... 
    } 
} 

と:touchesEndedrotatingをリセットすることを忘れないでください

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (rotating) 
    { 
    // your code 
    } 
} 

をし、 touchesCanceled

+0

または 'if((rotation = CGRectContainsPoint(wheelImage.frame、p)))')であるので、結果もNOに設定されます。 –