簡體   English   中英

禁用方向更改旋轉動畫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM