2012-01-21 89 views
2

我有一個應用多個變換到UIView的問題。例如,當我圍繞UIView的中心點旋轉一個旋轉角度,然後嘗試圍繞位於其之外的邊界點旋轉它時,第二個動畫就會全部混亂,例如,它會以與指定完全不同的方式抖動或旋轉。我該如何做到這一點,以便第一個動畫不會影響第二個動畫,但在第二個動畫播放時仍然存在?順序UIView變換

編輯:這是代碼。首先,我將視圖旋轉圍繞它的中心點:

CALayer *layer = view.layer; 

CATransform3D aTransform = CATransform3DIdentity; 
CGFloat zDistance = 2000; 
aTransform.m34 = 1.0/-zDistance; 
scrollView.layer.sublayerTransform = aTransform; 

CGFloat subviewX = 0.5; 
CGFloat subviewY = 0.5; 
[self setAnchorPoint:CGPointMake(subviewX, subviewY) forView:view]; 

CATransform3D bTransform = CATransform3DIdentity; 
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform]; 
bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0); 
rotateAnim.duration=0.05; 
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform]; 
layer.transform = bTransform; 
[layer addAnimation:rotateAnim forKey:nil]; 

現在,該層的旋轉,我想甩掉它周圍的屏幕左側邊框:

CALayer *layer = view.layer; 

CATransform3D aTransform = CATransform3DIdentity; 
CGFloat zDistance = 2000; 
aTransform.m34 = 1.0/-zDistance; 
tileScrollView.layer.sublayerTransform = aTransform; 

CGFloat subviewX = ((1/view.frame.size.width)*(view.frame.origin.x)); 
CGFloat subviewY = 0.5; 
[self setAnchorPoint:CGPointMake(-subviewX, subviewY) forView:view]; 

CATransform3D bTransform = layer.transform; 
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform]; 
bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0); 
rotateAnim.duration=0.2; 
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform]; 
layer.transform = bTransform; 
[layer addAnimation:rotateAnim forKey:nil]; 

因爲我想旋轉層是翻轉,我把CATransform3D bTransform = layer.transform而不是CATransform3D bTransform = CATransform3DIdentity在第二個動畫的開始,但再次,只有混亂動畫

另一個類似的問題,我有一個UIView包含9個子視圖,其中之一翻轉翱翔d每秒都是中心點。但是每次我對這9個UIViews的superView應用一個轉換時,子視圖的佈局就會變得混亂。有誰知道如何防止這種情況?任何幫助將不勝感激。提前致謝!

+2

向我們顯示代碼。 –

+0

有很多方法可以對視圖進行動畫處理,所以如果不向我們展示我們不知道您在做什麼。 –

回答

2

兩件事情:

  1. 在第一變換,這樣做:

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0); 
    

    意味着你身邊的軸線是x軸和y軸之間45°旋轉。這可能是你想要做的,但它似乎很奇怪。考慮更換爲

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 0, 1, 0); 
    
  2. 在第二個步驟,如果你只是想添加轉換到當前變換(即旋轉另一個180°),你需要改變這一行

    bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0); 
    

    bTransform = CATransform3DRotate(bTransform, -M_PI_2, 0, 1, 0); 
    

    這將轉換應用於現有轉換,而不是忽略當前轉換。