[英]Rotate UIView based on UITouch
我正在開發繪圖應用程序。
我希望用戶能夠在屏幕上“放置”一個形狀,然后根據需要移動,調整大小或旋轉它。
問題出在旋轉上。 我的搬動和調整大小工作正常。
之前,我是通過一個相當復雜且需要大量內存/處理器的過程來完成此任務的,現在我正在嘗試改進這一過程。
我已經搜索了,但是沒有找到與我嘗試的類似的答案。
基本上,假設用戶在“表面”上放置了一個正方形。 然后,他們點擊它並得到一些手柄。 他們可以觸摸任意位置並平移以移動正方形(已工作),觸摸並拖動其大小調整手柄以調整正方形(已工作),或抓住旋轉手柄以使正方形圍繞其中心旋轉。
我已經研究過使用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 Keynote似乎可以使用UIGestureRecognizers完成此操作,因為您必須使用兩個手指來旋轉添加的形狀。 這是要走的路嗎?
思考?
謝謝!
-(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];
}
這可能會有所幫助。
只需簡單的旋轉,您就可以省略動畫:
-(void)rotate:(CGFloat)angle
{
CGAffineTransform transform = CGAffineTransformRotate( myView.transform, angle * M_PI / 180.0 );
myView.transform = transform;
}
我使用一個簡單的NSTimer來控制動畫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.