当前位置: 首页 > 知识库问答 >
问题:

如何使用自动布局时,使翻转动画从一个UIView到另一个?

贺季
2023-03-14

我总是使用以下代码在一个视图和另一个视图之间制作翻转动画:

        [UIView transitionFromView:firstView
                        toView:secondView
                      duration:0.6
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished) {
                        // finish code here
                    }];

这工作得很好,给人一种自然的感觉。

但是,当我在使用自动布局在故事板上定义的视图上使用它时,事情开始变得一团糟——在这个动画之后,视图被调整大小并移动。

有没有办法通过设置约束动画来设置这种翻转的动画?

共有3个答案

孟成文
2023-03-14

如何设置约束更改的动画?:

您需要在动画块内调用layoutIfNeed。Apple实际上建议您在动画块之前调用一次,以确保所有挂起的布局操作都已完成。

从iOS:如何设置新自动布局约束(高度)的动画:

更新约束后:

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];

替换self。参照包含的视图查看。

耿锦
2023-03-14

我的猜测是,动画是通过动画层的~变换来执行的,并且该变换是从锚点位置所在的点应用的。您可以尝试用两种方法解决此问题:

第一:确保通过中心约束来定位视图,即对齐要变换的视图的中心(不是左视图、顶部视图、尾部视图等等)。例如,如果两个视图都有,则在superview中居中显示“水平垂直”,这(不确定)可能会有所帮助。

第二:创建包装视图,将这些视图作为子视图,并禁用它们的自动布局。

皮煜
2023-03-14

自动布局只能用于定位和调整视图大小。它不能用于生成产生翻转过渡效果所需的那种核心动画变换。因此,简短的确切答案是否定的,没有办法通过设置约束动画来设置这种翻转的动画。

但是,有一种简单的方法可以修改您已经使用的代码,使其与Auto Layout保持一致。这样做的方法是(1)在您订购动画之前将firstViewii dView添加到您的视图层次结构中,(2)确保您添加了定义这两个视图布局的Auto Layout约束,以及(3)向动画添加一个选项,以便您只显示/隐藏这两个视图,而不是拆除并设置新的视图层次结构。

换言之,您想要的是:

        // assert: secondView added to view hierarchy
        // assert: secondView.hidden == true
        // assert: secondView has correct constraints
        [UIView transitionFromView:firstView
                            toView:secondView
                           duration:0.6
                            options:UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionShowHideTransitionViews
                         completion:nil];

为什么需要这个?原因是,如果没有UIViewAnimationOptionShowHideTransitionViews选项,方法将实际操作视图层次并添加新的目标视图。如果启用了自动布局,则不会正确布局,因为它没有约束。

您可以在此处看到一个显示此方法的示例项目:https://github.com/algal/AutoLayoutFlipDemo

或者,您还可以使用现有的对transtionFromView: toView:期限:选项:完成:的调用。但是,如果您不打算只显示已经有约束的目标视图,那么您需要使用完成块来添加这些约束,如下所示:

    [UIView transitionFromView:firstView
                        toView:secondView
                       duration:0.6
                        options:UIViewAnimationOptionTransitionFlipFromLeft
                     completion:^(BOOL finished) {
 [self.view addConstraint:[NSLayoutConstraint                               
  constraintWithItem:secondView
  attribute:NSLayoutAttributeCenterX
  relatedBy:NSLayoutRelationEqual
  toItem:self.view
  attribute:NSLayoutAttributeCenterX
  multiplier:1 constant:0]];

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:secondView
  attribute:NSLayoutAttributeCenterY
  relatedBy:NSLayoutRelationEqual
  toItem:self.view
  attribute:NSLayoutAttributeCenterY
  multiplier:1 constant:0]];
                }];

这种方法的一个工作示例如下:https://github.com/algal/AutoLayoutFlipDemo2

 类似资料:
  • 当我打开视图控制器时,我有一个从顶部飞出的视图。我已将UIView的Y约束设置为-200,当视图加载时,将调用以下内容,一切正常: 但是现在我有一个关闭按钮,它应该将动画回到-200位置,然后从屏幕上删除视图控制器。但是这个动画没有发生。视图控制器被直接删除。这是我正在做的: 我提到了这个链接。这似乎对他们有效,但对我无效。请帮忙。

  • 我有一个观点,我已经以以下方式发出通知。 我在填充视图的视图中有一个UIImageView。 该视图具有以下约束: 水平居中 我想通过翻转视图来设置视图的动画。我尝试了两种方法来做到这一点。 方法1:使用视图转换 这将导致在动画翻转时显示完整图像(图像丢失纵横比填充,看起来像是在视图中而不是视图本身翻转图像)。 方法2:应用层变换 这会导致一个非常糟糕的动画,其中视图控制器的一半被切断。我相信这可

  • 我有一个自定义视图CustomLayout(蓝色,自定义UIView),该视图包含3个子视图,通过使用约束(布局锚定)垂直对齐,每个视图按照以下顺序对齐: 1视图:幻灯片(红色,自定义UIView) 我想,当我单击按钮(黄色)时,如果使用动画打开,SlideLayout(红色)的高度大小会增加,如果关闭,则会减少。和其他视图必须在动画期间更改位置,如果SlideLayout增加/减少,则父视图(C

  • 我有一个UIImageView,我想在背景上用平移效果慢慢动画。我的背景图像视图有四个约束: 从顶部到顶部布局指南的距离(零) 图像视图的视图模式设置为“纵横比填充”。当我运行我的应用程序时,没有问题,会显示静态图像。我添加以下代码来设置视图的动画: 然后我调用[self-AnimateBackground Horizontal:YES] 视图将显示:。发生的情况如下: 图像从一个意外(但始终相同

  • 我一直使用两个布局文件使用constraintlayout动画 然而,在布局中,我只更改了两个约束。我决定尝试以编程方式这样做,并且这样做了,这起作用了。 然而,这不是动画。我试着像之前在第一个中那样进行动画(这次只使用了一个布局文件),结果是这样的 这与第二个一样工作,但没有显示动画,新的约束立即跳入适当的位置。有没有什么方法可以让动画工作不使用两个layoyuts?还是我做错了什么?多谢了。

  • 关于UITableViewCell高度动画,在堆栈溢出方面有很多类似的问题,但对于新的iOS8自动布局驱动的表视图,这些问题都不起作用。我的问题: 自定义单元格: 注意旋转木马高度限制。这是内容视图的子视图(唯一的子视图)的高度约束。 然后,在“查看我要展开的所有操作”单元上,我的代码: 如您所见,我尝试使用这个很好的旧解决方案: 您可以在选中UITableViewCell时设置高度更改的动画吗?