2011-06-23 322 views
0

在我的應用程序中遇到一些麻煩。我質疑我的做法。UIView touch問題/問題

這裏是一個圖像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的工作?
  2. 我應該爲這個輪子創建一個自定義UIView,然後將其添加到我的主視圖控制器? 2.a.如果我確實創建了一個定製,我會在觸摸時遇到同樣的問題嗎?

回答

2

您可能需要考慮使用UISwipeGestureRecognizer並將其僅添加到您希望識別滑動的視圖中。

+0

我加了識別器。看起來它只是在UIImageView上工作,這很酷。我只需要玩動畫。如果我使用與我的touchMoved相同的代碼,就會非常不連貫。我需要查看識別器,看看它每隔幾次掃描一次纔會觸發多少次。 – jdruid

+0

嗯,想象一下,UIPanGestureRecognizer在您的情況下可能會更好地工作,因爲它在移動視圖時會精確地跟蹤手指。 – Jamie

+0

我現在正在使用Swipe。我把它做得很好。一旦我獲得了創意,我可能會回到潘,看看它是如何工作的。感謝您的線索! – jdruid

1

如果您繼承了UIImageView並將該代碼放入其中,那麼您只會從該視圖中獲得觸覺,您可能需要將acceptsUserInteraction設置爲YES。也改變locationInView:自我;如果從nib加載,請務必將該類設置爲該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 
     ... 
    } 
} 

和:

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

記得touchesEnded重置rotatingtouchesCanceled

+0

或'if((rotate = CGRectContainsPoint(wheelImage.frame,p)))''所以它也會設置爲NO結果。 –