以模态方式呈现视图控制器会重置当前视图
Presenting a View Controller Modally Resets The Current View
问题
我正在尝试以模态方式呈现视图控制器(准确地说是 UIImagePickerController),同时在呈现之前对一些视图进行动画处理。
重要的是要注意动画和视图的呈现不是链接的,并且动画和模态呈现图像选择器的视图之间可能存在时间间隔。
综上所述,当我呈现视图控制器时,我所在的当前视图(我呈现的视图 - 父视图控制器的视图)的所有子视图似乎都被重置了到它们原来的 "storyboard" 位置,这会导致我在呈现图像选择器之前在视图中完成的所有动画重置。
另一件值得注意的事情是,我使用 AutoLayout 来定位我制作动画的视图。
我添加了一个显示问题的示例动画 - 请注意 "Animate" 按钮如何在我单击 "Present Modal View Controller" 按钮后立即恢复到其原始位置(我已切换 "Slow Animations" 在呈现模态视图控制器之前,您可以看到 "Animate" 按钮弹回)。
我还将 link 添加到动画中显示的示例应用程序,以便您更深入地检查问题,click here 下载它。
回答
为了解决这个问题,我使用了@kokx 的回答,并对视图的自动布局约束而不是它们的帧值进行了动画处理。为此,我只是为要修改的约束创建了出口,并修改了约束的 constant
属性。
要为更改设置动画,只需调用原始 [UIView animateWithDuration:options:animations:completion:]
,同时将其 animations:
部分的任何动画代码替换为对 [self.view layoutIfNeeded]
.
的调用
要解决该问题,您需要使用 NSLayoutConstraint
以及更改约束而不是更改框架。
请查看附件视频,问题已解决。
Video Link
代码如下:
self.topcons.constant = self.topcons.constant - 220;
[UIView animateWithDuration:0.4f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
[self.view layoutIfNeeded];
} completion:nil];
谢谢
问题
我正在尝试以模态方式呈现视图控制器(准确地说是 UIImagePickerController),同时在呈现之前对一些视图进行动画处理。
重要的是要注意动画和视图的呈现不是链接的,并且动画和模态呈现图像选择器的视图之间可能存在时间间隔。
综上所述,当我呈现视图控制器时,我所在的当前视图(我呈现的视图 - 父视图控制器的视图)的所有子视图似乎都被重置了到它们原来的 "storyboard" 位置,这会导致我在呈现图像选择器之前在视图中完成的所有动画重置。
另一件值得注意的事情是,我使用 AutoLayout 来定位我制作动画的视图。
我添加了一个显示问题的示例动画 - 请注意 "Animate" 按钮如何在我单击 "Present Modal View Controller" 按钮后立即恢复到其原始位置(我已切换 "Slow Animations" 在呈现模态视图控制器之前,您可以看到 "Animate" 按钮弹回)。
我还将 link 添加到动画中显示的示例应用程序,以便您更深入地检查问题,click here 下载它。
回答
为了解决这个问题,我使用了@kokx 的回答,并对视图的自动布局约束而不是它们的帧值进行了动画处理。为此,我只是为要修改的约束创建了出口,并修改了约束的 constant
属性。
要为更改设置动画,只需调用原始 [UIView animateWithDuration:options:animations:completion:]
,同时将其 animations:
部分的任何动画代码替换为对 [self.view layoutIfNeeded]
.
要解决该问题,您需要使用 NSLayoutConstraint
以及更改约束而不是更改框架。
请查看附件视频,问题已解决。 Video Link
代码如下:
self.topcons.constant = self.topcons.constant - 220;
[UIView animateWithDuration:0.4f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
[self.view layoutIfNeeded];
} completion:nil];
谢谢