2012-10-01 64 views
0

我正在做一個應用程序,它具有旋轉和重新調整視圖大小的功能。我已經實現了這個功能,但是我確實遇到了一個問題。如何調整UIView時CGAffineTransformIdentity

我的問題

觀西港島線拖動四個角的時候,調整其大小,我可以旋轉在兩個方向上的觀點之後被調整。

旋轉完成後,如果我再次嘗試通過拖動其角來重新調整視圖大小,視圖的大小已變爲不可預知的值,並且它在屏幕上四處移動。

我GOOGLE了很多最後我得到了以下的解決方案

The frame property is undefined when transform != CGAffineTransformIdentity, as per the docs on UIView 

我看到一個應用程序,它已經實施正是我希望實現的功能。

我如何可以調整的UIView UIView的旋轉後

我的代碼調整視圖

倒是開始

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    UITouch *touch = [[event allTouches] anyObject]; 

    NSLog(@"[touch view]:::%@",[touch view]); 

    touchStart = [[touches anyObject] locationInView:testVw]; 
    isResizingLR = (testVw.bounds.size.width - touchStart.x < kResizeThumbSize &&  testVw.bounds.size.height - touchStart.y < kResizeThumbSize); 
    isResizingUL = (touchStart.x <kResizeThumbSize && touchStart.y <kResizeThumbSize); 
    isResizingUR = (testVw.bounds.size.width-touchStart.x < kResizeThumbSize &&  touchStart.y<kResizeThumbSize); 
    isResizingLL = (touchStart.x <kResizeThumbSize && testVw.bounds.size.height -touchStart.y <kResizeThumbSize);  
} 

倒是動了

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
CGPoint touchPoint = [[touches anyObject] locationInView:testVw]; 
CGPoint previous=[[touches anyObject]previousLocationInView:testVw]; 

float deltaWidth = touchPoint.x-previous.x; 
float deltaHeight = touchPoint.y-previous.y; 

NSLog(@"CVTM:%@",NSStringFromCGRect(testVw.frame)); 


if (isResizingLR) { 
testVw.frame = CGRectMake(testVw.frame.origin.x, testVw.frame.origin.y,touchPoint.x + deltaWidth, touchPoint.y + deltaWidth); 
} 
if (isResizingUL) { 
testVw.frame = CGRectMake(testVw.frame.origin.x + deltaWidth, testVw.frame.origin.y + deltaHeight, testVw.frame.size.width - deltaWidth, testVw.frame.size.height - deltaHeight); 
} 
if (isResizingUR) { 
    testVw.frame = CGRectMake(testVw.frame.origin.x ,testVw.frame.origin.y + deltaHeight, testVw.frame.size.width + deltaWidth, testVw.frame.size.height - deltaHeight);  
} 
if (isResizingLL) { 
testVw.frame = CGRectMake(testVw.frame.origin.x + deltaWidth ,testVw.frame.origin.y , testVw.frame.size.width - deltaWidth, testVw.frame.size.height + deltaHeight); 
} 

if (!isResizingUL && !isResizingLR && !isResizingUR && !isResizingLL) { 
testVw.center = CGPointMake(testVw.center.x + touchPoint.x - touchStart.x,testVw.center.y + touchPoint.y - touchStart.y); 
} 

} 
+0

我有完全相同的問題,我想知道是否有任何解決方案。如果是這樣,請發帖。 – Vad

回答

0

既然你不使用的UIView動畫可以保存當前視圖的轉換,設置視圖的變換身份,調整視圖大小並重新保存變換:

UIView *v; 
CGAffineTransform t = v.transform; 
v.transform = CGAffineTransformIdentity; 
CGFloat scale = 2.0f; 
v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, v.frame.size.width*scale , v.frame.size.height*scale); 
v.transform = t; 

(EDIT)關於您的大小調整:

A' = A 
C' = C' //touch input 
B' = A + (normalized(B-A) * dotProduct((C'-A), normalized(B-A))) 
D' = A + (normalized(D-A) * dotProduct((C'-A), normalized(D-A))) 

船尾:如果用4個矢量(點)A,B,C,d其中(A+C)*.5 = (B+D)*.5 = rectangle_center然後用於移動點C到位置C '也將移動B和d到B' 和d'定義矩形呃是:

  • 改變你的看法身份
  • 組框架(.0f, .0f, length(A-D), length(A-C))
  • 集中心(A+D)*.5f
  • GET旋轉創建視圖的通過atanf(height/width)很少變換的「如果」或填充/與創建變換鹼基載體是normalized(D-A)normalized(B-A)

您可以對矩形中的任意點執行此操作。

+0

感謝您的回覆。我試過這種方式,但不工作 – Gowtham

+0

實際上你的代碼中還有其他一些問題。我認爲如果你嘗試只有4個可移動的點,然後根據這4點設置視圖會更好。你需要更多的代碼來做這種調整大小和移動。 –