[英]Disable orientation change rotation animation
我需要禁用在方向改變時播放的動畫。 這可能嗎? 如果沒有,是否可以加快速度?
只是為了澄清,我不想停止方向變化,只是動畫。 我想要一個即時的方向改變。
是的,可以禁用動畫,而不會破壞所有內容。
以下代碼將禁用“黑匣子”旋轉動畫,而不會與其他動畫或方向代碼混淆:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[UIView setAnimationsEnabled:YES];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[UIView setAnimationsEnabled:NO];
/* Your original orientation booleans*/
return TRUE;
}
把它放在你的 UIViewController 中,一切都應該很好。 同樣的方法可以應用於 iOS 中任何不需要的動畫。
祝你的項目好運。
對於 2016 年,似乎shouldAutorotateToInterfaceOrientation
無法被覆蓋。 以下似乎確實有效,並且不會造成其他傷害。
// these DO SEEM TO WORK, 2016
override func willRotateToInterfaceOrientation(
toInterfaceOrientation:UIInterfaceOrientation, duration:NSTimeInterval)
{
UIView.setAnimationsEnabled(false)
super.willRotateToInterfaceOrientation(toInterfaceOrientation,duration:duration)
}
override func didRotateFromInterfaceOrientation(
fromInterfaceOrientation:UIInterfaceOrientation)
{
super.didRotateFromInterfaceOrientation(fromInterfaceOrientation)
UIView.setAnimationsEnabled(true)
}
然而!! 實際上,這兩個功能都已棄用。 viewWillTransitionToSize
現在處理“之前”和“之后”。
override func viewWillTransitionToSize(size:CGSize,
withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
{
coordinator.animateAlongsideTransition(nil, completion:
{_ in
UIView.setAnimationsEnabled(true)
})
UIView.setAnimationsEnabled(false)
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
}
在 iOS8 中,您可以通過在視圖控制器的viewWillTransitionToSize
實現中禁用 CALayer 動畫來禁用旋轉動畫。
如果您想自定義轉換(請參閱 WWDC 2014“iOS 8 中的視圖控制器改進”),但如果您只想阻止動畫,則接受的答案中提到的反向旋轉很有用。
(注意實現viewWillTransitionToSize
將防止調用已棄用的 iOS8 之前的旋轉 API。)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[CATransaction begin];
[CATransaction setDisableActions:YES];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// You could make a call to update constraints based on the
// new orientation here.
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
[CATransaction commit];
}];
}
基於 Nils Munch 的回答,這是 Swift 3 版本:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: nil) { (_) in
UIView.setAnimationsEnabled(true)
}
UIView.setAnimationsEnabled(false)
super.viewWillTransition(to: size, with: coordinator)
}
如果我沒記錯的話(這總是我必須玩一會兒才能正確的事情) willRotateToInterfaceOrientation:duration:
和willAnimateRotationToInterfaceOrientation:duration:
都在動畫塊內,而didRotateFromInterfaceOrientation:
在動畫塊之后運行。 我相信您需要在willRotate
布置您的視圖,以便它們出現在它們在旋轉后出現的位置,如果它們沒有旋轉(如果這是有道理的)。 通過這種方式,動畫會將它們從原始(正確)布局設置為與設備旋轉方向相反的新(旋轉)布局,從而創建沒有動畫的外觀。 旋轉完成后,您可以在didRotate
布置您的視圖,無需動畫,給人的印象是它們立即旋轉。
清澈如泥,不是嗎?
如果在視圖即將旋轉時重新布局視圖,我認為當它真正旋轉時它不會有動畫。 我的意思是,為每個子視圖編寫一個具有新坐標、框架、位置的方法,並在willRotateToInterfaceOrientation:duration:
或willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
調用該方法(雖然這不是一個聰明的做事方式。我想知道,你為什么需要沒有動畫?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.