带ViewWillLayoutSubview的IOS动画

带ViewWillLayoutSubview的IOS动画,ios,Ios,我在viewController中设置了此动画,以便在菜单中缩小并向下滑动 -(void)dismissMenuWithAnimation { CGRect originalFrame = self.view.frame; [UIView animateWithDuration:2 animations:^{ self.view.frame = CGRectMake(originalFra

我在viewController中设置了此动画,以便在菜单中缩小并向下滑动

-(void)dismissMenuWithAnimation
{
    CGRect originalFrame = self.view.frame;
    [UIView animateWithDuration:2
                     animations:^{
                         self.view.frame = CGRectMake(originalFrame.origin.x,originalFrame.origin.y+originalFrame.size.height,originalFrame.size.width,10);
                     }
                     completion:^(BOOL finished){
                         [self.view removeFromSuperview];
                         self.view.frame = originalFrame;
                     }];
}
在同一个viewController中,我将覆盖ViewWillLayoutSubView:

我有几个子视图的框架是在这个viewWillLayoutSubviews方法中设置的。未在viewDidLoad中设置,因为此时帧仍然不正确

问题是,当我关闭菜单时,首先调用动画块,不知何故,self.view.frame立即设置为高度10。缩小的框架。当到达viewWillLayoutSubviews时,边界高度为10。这会导致其他子视图显示不正确


这似乎很愚蠢,但我不知道如何解决这个问题。有人能帮忙吗?谢谢

我自己的解决方案是根本不使用ViewWillLayoutSubView。我只是使用自动调整大小的遮罩来确保帧的大小正确

我自己的解决方案是根本不使用ViewWillLayoutSubView。我只是使用自动调整大小的遮罩来确保帧的大小正确

我刚刚遇到了与作者相同的问题。虽然这个问题已经很老了,但我会发布我的解决方案,希望有人会像我一样碰到这个问题

该解决方案非常简单,完全类似于基于自动布局的动画:

UIView.animate(
  withDuration: 0.2,
  delay: 0,
  options: .curveEaseInOut,
  animations: {
    // This will launch viewWillLayoutSubviews!
    self.view.setNeedsLayout()
    self.view.layoutIfNeeded()
},
  completion: nil)
和Objective-C版本:

[UIView animateWithDuration:0.2
                    delay:0
                  options:UIViewAnimationOptionCurveEaseInOut
               animations:^{
                 // This will launch viewWillLayoutSubviews!
                 [self.view setNeedsLayout];
                 [self.view layoutIfNeeded];
               }
               completion:nil];

我喜欢完全编程的布局,尽管2017年我们有自动布局引擎。

我遇到了与作者相同的问题。虽然这个问题已经很老了,但我会发布我的解决方案,希望有人会像我一样碰到这个问题

该解决方案非常简单,完全类似于基于自动布局的动画:

UIView.animate(
  withDuration: 0.2,
  delay: 0,
  options: .curveEaseInOut,
  animations: {
    // This will launch viewWillLayoutSubviews!
    self.view.setNeedsLayout()
    self.view.layoutIfNeeded()
},
  completion: nil)
和Objective-C版本:

[UIView animateWithDuration:0.2
                    delay:0
                  options:UIViewAnimationOptionCurveEaseInOut
               animations:^{
                 // This will launch viewWillLayoutSubviews!
                 [self.view setNeedsLayout];
                 [self.view layoutIfNeeded];
               }
               completion:nil];

我喜欢完全编程的布局,尽管2017年我们有自动布局引擎。

你说“这会导致我的其他子视图显示不正确”是什么意思?它们有什么不正确之处?另外,您的视图控制器的顶级视图self.view似乎是菜单。对吗?子视图是否在菜单视图中?基本上,我需要在viewWillLayoutSubview中获取视图帧,但是动画通过将帧直接设置为动画末尾的帧而弄乱了帧。但要回答您的问题,self.view是菜单,菜单视图中有子视图。您说“这会导致其他子视图显示不正确”是什么意思?它们有什么不正确之处?另外,您的视图控制器的顶级视图self.view似乎是菜单。对吗?子视图是否在菜单视图中?基本上,我需要在viewWillLayoutSubview中获取视图帧,但是动画通过将帧直接设置为动画末尾的帧而弄乱了帧。但是为了回答您的问题,self.view是菜单,菜单视图中有子视图。谢谢,我发现它在视图中也可以工作,在其生命周期的稍晚一点时,它在调用viewWillLayoutSubviews时工作,但不早于调用ViewWillDisplay时工作。谢谢,我发现它在视图的生命周期稍晚一点时也可以工作。它在调用viewWillLayoutSubviews时可以工作,但在调用ViewWillAppeal时就不能工作了。