2014-03-01 34 views
1

根據可用的Apple文檔here,可以動畫UIView的bounds屬性。動畫UIView的邊界屬性

爲了編程旋轉自己的看法(在這種情況下,從縱向到橫向)之一,我實現了下面的代碼:

float w = controlsView.bounds.size.width; 
float h = controlsView.bounds.size.height; 

CGAffineTransform T = CGAffineTransformMakeRotation(M_PI/2); 

UIViewContentMode oldContentMode = controlsView.contentMode; 
controlsView.contentMode = UIViewContentModeRedraw; 

[UIView animateWithDuration:1.0 animations:^{ 
     controlsView.bounds = CGRectMake(0, 0, h, w); 
     controlsView.transform = T; 
}]; 

controlsView.contentMode = oldContentMode; 

我加了兩條指令爲contentMode,因爲我已經在計算器上的某個地方閱讀必須將contentMode設置爲該值,以便UIView在修改bounds屬性時重繪內容(但在這種情況下,它不會以任何方式影響行爲)。

該代碼的問題是,UIView沒有動畫調整大小,但一次。

執行該代碼,首先調整UIView的大小(沒有動畫),然後用動畫旋轉。

如何爲調整大小設置動畫效果?

- 更新 -

我試圖縮放和旋轉改造結合起來。 UIView在動畫中旋轉和縮放,但最後它的bounds屬性不會改變:即使它已經旋轉到橫向(我的iPhone應該是568x320),其寬度和高度仍然保持縱向值( 320x568)。事實上,controlsView上的UI控件變形(錯誤的寬高比)並顯得拉長。

+0

爲什麼不使用縮放和旋轉變換? – Wain

回答

0

問題是,當您設置transform屬性時,所有其他轉換(bounds)都將被覆蓋。要修復它,你必須創建一個transform,結合縮放旋轉

例子:

CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.5, 0.5); 

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

你需要計算基於你想擁有在動畫的最後大小縮放XY值。您可能還想要更改anchorPoint屬性以設置用於縮放的中心點(controlsView.layer.anchorPoint)。

+0

根據文檔,我應該能夠在使用特定的'trasnform'時動畫'bounds'屬性。這是文檔爲「frame」屬性報告的內容: 修改此屬性以相對於其超級視圖的座標系更改視圖的大小和位置。 (如果transform屬性不包含標識轉換,請修改邊界或中心屬性。) –

1

這個工作我使用 UIViewAnimationOptions.LayoutSubviews(SWIFT)爲:

UIView.animateWithDuration(1.0,delay:0.0, 
options:UIViewAnimationOptions.LayoutSubviews, 
animations:{() -> Void in 
    myView.transform = myRotationTransform 
    myView.bounds = myBounds 
}, completion: nil) 

(沒有明確的尺度,也沒有改變contentMode)

0

動畫您邊界不會改變它的值。一旦動畫結束,它將恢復到其原始值。

動畫結束後,將邊界值更改爲最終值。我會解決這個問題。