簡體   English   中英

基於UITouch旋轉UIView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM