2010-10-16 56 views
2

我正在繪製應用程序。基於UITouch旋轉UIView

我希望用戶能夠在屏幕上「放下」一個形狀,然後根據需要移動,調整大小或旋轉它。

問題在於旋轉。我有移動和調整大小工作正常。

我之前是用一個相當複雜的內存/處理器密集型過程來完成這項工作的,現在我正試圖改進它。

我已經搜索和搜索,但還沒有找到類似於我想要做的答案。

基本上,我們假設用戶在「表面」上放下一個正方形。然後,他們點擊它,並得到一些手柄。他們可以觸摸任何地方並平移移動方塊(已經工作),觸摸並拖動調整大小手柄調整方塊大小(已經工作),或者抓住旋轉手柄使方塊圍繞其中心旋轉。

我已經看過使用UIBezierPath繪製廣場或只是它是我填寫的UIView的子類。

在這兩種情況下,我試圖旋轉UIView本身,而不是內部的一些內容。每次我嘗試旋轉視圖時,無論是什麼都沒有發生,視圖騰出了屏幕,或者旋轉了一點點,然後停下來。

下面是一些我試過的代碼(這是不行的,我已經嘗試了很多不同的方法來此):

- (void) rotateByAngle:(CGFloat)angle 
{ 

CGPoint cntr = [self center]; 

CGAffineTransform move = CGAffineTransformMakeTranslation(-1 * cntr.x, -1 * cntr.y); 
[[self path] applyTransform:move]; 

CGAffineTransform rotate = CGAffineTransformMakeRotation(angle * M_PI/180.0); 
[[self path] applyTransform:rotate]; 

[self setNeedsDisplay]; 
CGAffineTransform moveback = CGAffineTransformMakeTranslation(cntr.x, cntr.y); 
[[self path] applyTransform:moveback]; 

} 

如果它不是明顯,在這裏考慮將視圖移動到原點(0,0),圍繞該點旋轉,然後將其移回。

如果您想知道「角度」是否正確計算。我還將上面的代碼封裝在[UIView beginAnimations:nil context:NULL]/[UIView commitAnimations]區塊中。

是否有可能旋轉UIView「自定義」金額?我已經看過/完成過之前讓動畫旋轉的控件,但在這些示例中,控件始終以「方形」結束(即旋轉了1個或更多個整圓並返回其開始方向)。

是否有可能爲了響應UITouches而「實時」執行此輪換?我是否需要在UIView的圖層中繪製正方形作爲一個項目,然後旋轉圖層?

就這麼你知道,我之前工作的是由一組線條或UIBezierPaths繪製的形狀。我會將CGAffineTransform應用於數據,然後調用drawRect:方法,該方法將重新繪製自定義UIView內的對象。這個UIView將承載相當多的這些項目,所有這些都需要在他們需要的時候重新繪製。

因此,我試圖通過創建一堆UIView子類來使應用更具性能,當用戶用它們做某些事情時,它只會得到一個重新繪製的命令。 Apple的iPad主題演講似乎使用UIGestureRecognizers實現了這一點,因爲您必須使用兩個手指來旋轉添加的形狀。這是要走的路嗎?

想法?

謝謝!

+0

Apple的示例應用程序[Touches_GestureRecognizers](http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html)(不是Touches_Classic)顯示瞭如何使用Pan,Pinch和Rotation手勢識別器可以輕鬆完成這一切。 – Anna 2010-10-16 13:27:05

+0

是的......我發現發佈後約10分鐘。我在大約6個小時的搜索後發佈了這個消息。抱歉。 – mbm29414 2010-10-16 14:03:03

回答

4
-(void)rotate{ 
    CGAffineTransform transform; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationCurve:UIViewAnimationOptionBeginFromCurrentState]; 
    myView.alpha = 1; 
    transform = CGAffineTransformRotate(myView.transform,0.5*M_PI); 
    [myView setUserInteractionEnabled:YES]; 
    myView.transform = transform; 
    [UIView commitAnimations]; 
} 

這可能有幫助。

1

只是簡單的旋轉,你可能會離開了動畫:

-(void)rotate:(CGFloat)angle 
{ 
    CGAffineTransform transform = CGAffineTransformRotate(myView.transform, angle * M_PI/180.0); 
    myView.transform = transform; 
} 

我用一個簡單的NSTimer來控制動畫。