2014-10-05 47 views
1

我使用下面的代碼將我的UIView旋轉到90度。使用CGAffineTransformMakeRotation旋轉UIView

- (IBAction)rotateView:(id)sender { 

    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    }]; 
} 

如果我打電話rotateView再次行動,_myView不會再轉動。任何想法如何解決?我想每次調用rotateView時將_myView旋轉90度。

回答

0

將變換添加到myView中時,您不是將變換應用於現有變換狀態,而是覆蓋變換。這意味着當你第二次設置transform = CGAffineTransformMakeRotation(M_PI/2)時,你根本沒有改變轉換。

編輯: 正如羅布所指出的,當旋轉值已存儲在變換中時,不需要使用屬性rotationInRadians。相反,你可以簡單地修改現有的變換是這樣的:

[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}]; 

下面是一個不理想的解決方案,我以前提出。

您將需要一個跟蹤您的旋轉的變量。每次旋轉時,您將按照您希望的數量遞增該變量,然後根據變量的新值創建新的變換。

使屬性做到這一點:

@property (nonatomic, assign) CGFloat rotationInRadians; 

它在你的init方法初始化爲0。然後修改您的rotateView方法以增加rotationInRadians並應用新的變換。

- (IBAction)rotateView:(id)sender { 
    self.rotationInRadians += M_PI/2; 
    [UIView animateWithDuration:0.2 animations:^{ 
     _myView.transform = CGAffineTransformMakeRotation(self.rotationInRadians); 
    }]; 
} 
+0

驚人!非常感謝。 – 2014-10-05 01:43:06

+0

當視圖已經在視圖的變換中時,沒有理由跟蹤單獨變量中的旋轉。 – 2014-10-05 01:55:19

+0

好點。我看不出將它存儲在外部變量中的好處。我會說羅布的答案更簡單,更正確。 – dfmuir 2014-10-05 01:58:49

2
[UIView animateWithDuration:0.2 animations:^{ 
    _myView.transform = CGAffineTransformRotate(_myView.transform, M_PI/2); 
}];