代码之家  ›  专栏  ›  技术社区  ›  Arlen Anderson

禁用方向更改旋转动画

  •  25
  • Arlen Anderson  · 技术社区  · 15 年前

    我需要禁用方向更改时播放的动画。这有可能吗?如果没有,是否可以加速?

    只是澄清一下,我不想停止方向的改变,只是动画。我想马上改变一下方向。

    5 回复  |  直到 8 年前
        1
  •  2
  •   Adam Milligan    15 年前

    如果我没记错的话(这一直是我为了正确而必须玩的事情) willRotateToInterfaceOrientation:duration: willAnimateRotationToInterfaceOrientation:duration: 都在动画块中,而 didRotateFromInterfaceOrientation: 在动画块之后运行。我相信你需要在 willRotate 所以它们出现在旋转后的位置 他们没有旋转吗 (如果这有道理的话)。这样,动画将使它们从原始(正确)布局动画到新(旋转)布局,与设备旋转方向相反,从而创建无动画的外观。旋转完成后,可以在不使用动画的情况下,在 didRotate 给人的印象是它们会立即旋转。

    像泥一样清澈,不是吗?

        2
  •  48
  •   Fattie    9 年前

    是的,可以禁用动画,而不会将所有内容分开。

    以下代码将禁用“黑匣子”旋转动画,而不会干扰其他动画或方向代码:

    - (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);
        }
    
        3
  •  12
  •   adamz    10 年前

    在ios8中,可以通过在视图控制器的实现中禁用calayer动画来禁用旋转动画。 viewWillTransitionToSize .

    如果你想的话,在接受的答案中提到的反向旋转是有用的。 定制 转换(请参阅WWDC 2014“iOS 8中的视图控制器升级”),但如果您只想阻止动画,则不能。

    (注意:实施 视图将转换为大小 将阻止调用已弃用的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];
        }];
    }
    
        4
  •  3
  •   Bruno Paulino    8 年前

    根据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)
    }
    
        5
  •  0
  •   nacho4d    15 年前

    如果在视图即将旋转时重新布局视图,我认为当它真正旋转时,将不会有动画。 我的意思是,用每个子视图的新坐标、框架和位置编写一个方法,并在 willRotateToInterfaceOrientation:duration: willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: (但这不是一种明智的做法。我想知道,为什么你不需要动画?)