2011-08-30 70 views
0

我正在旋轉使用Core Animation來響應UISwipeGesture的UIView子類對象。使用Core Animation和塊旋轉UIView對象問題

描述上下文:我有一個圓形錶盤,我已經在CG中繪製並添加到主視圖中作爲子視圖。 爲了響應滑動手勢,我正在指示它在任一方向上旋轉15度,具體取決於滑動手勢是向左還是向右滑動。

問題,它只會一次旋轉。隨後的手勢被識別(從觸發的其他動作中可以看出),但動畫不會重複。我可以一次往後走一次。但試圖在任何方向多次都行不通。下面是相關的代碼,讓我知道你的想法...

- (IBAction)handleLeftSwipe:(UISwipeGestureRecognizer *)sender 
{ 
    if ([control1 pointInside:[sender locationInView:control1] withEvent:nil]) 
    { 
    //updates the display value 
    testDisplay.displayValue = testDisplay.displayValue + 0.1; 
    [testDisplay setNeedsDisplay]; 

    //rotates the dial 
    [UIView animateWithDuration:0.25 animations:^{ 
     CGAffineTransform xform = CGAffineTransformMakeRotation(radians(+15)); 
     control1.transform = xform; 
     [control1 setNeedsDisplay]; 
    }]; 
} 
+0

我打算查看下面的答案,但只是爲了讓事情更加複雜...... UIView撥號盤有陰影。旋轉視圖也會旋轉陰影。我想我需要一種方法將CTM(變換矩陣)上的位置恢復15度並重新繪製以避免陰影問題?我不知道如何在視圖的drawRect方法之外設置CTM的改變。我無法在視圖控制器中引用視圖的圖形上下文。我認爲。我可能是錯的... – Cocoadelica

+0

那麼你想旋轉撥號而不是影子?錶盤和陰影在同一視圖中嗎?對這兩個問題都回答爲「 – Kaiser

+0

」。我可以在錶盤下面放置另一個視圖,使其隱藏起來,除了陰影以外,還使用我們討論的計數器方法。它只是我不能相信沒有什麼方法可以重置變換矩陣。我已經通過文檔,但無法看到任何東西。也許這只是我需要接受的東西。 – Cocoadelica

回答

3

CGAffineTransform的XForm = CGAffineTransformMakeRotation(弧度(+15));

你是否總是保持旋轉的距離。 CGAffineTransformMakeRotation不是加法的。只使用最新的。所以你每次設置爲15,而不是每次15。

+2

此外:雖然通過'control1.transform'屬性讀取旋轉是有吸引力的(例如,通過'CGAffineTransformRotate'隱式地),但是隨着時間的推移會存在舍入誤差的風險。因此,最好將角度作爲實例變量進行跟蹤,並繼續使用'CGAffineTransformMakeRotation'。 – Tommy

+0

啊,所以你的意思是每次我觸發旋轉增加一個計數器並旋轉15 *計數器? – Cocoadelica

+0

也很多很多謝謝你的即時回覆 – Cocoadelica

1

下面是一個超級簡單的示例,用於累計旋轉視圖。這將按鈕按下180度旋轉視圖。

- (IBAction) onRotateMyView: (id) sender 
    { 

    [UIView animateWithDuration:0.3 animations:^{ 
      myView.transform = CGAffineTransformMakeRotation(M_PI/2*rotationCounter); 
    } completion:^(BOOL finished){ 
     //No nothing 
    }]; 

    ++rotationCounter; 
}