gpt4 book ai didi

IOS 动画与 ViewWillLayoutSubview

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:48:30 28 4
gpt4 key购买 nike

我的 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 中,我覆盖了 viewWillLayoutSubviews:

-(void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];

CGRect viewBounds = self.view.bounds;
self.subView1.frame = CGRectMake(self.menuItemMidPosition,viewBounds.size.height-SUBVIEW1_HEIGHT,SUBVIEW1_WIDTH,SUBVIEW1_HEIGHT);

}

我有几个 subview ,它们的框架是在这个 viewWillLayoutSubviews 方法中设置的。没有在 viewDidLoad 中设置它,因为那时框架仍然不正确。

问题是,当我关闭菜单时,首先调用动画 block ,并且不知何故 self.view.frame 立即设置为高度 10。(缩小的帧)。当它到达 viewWillLayoutSubviews 时,边界高度为 10。这导致我的其他 subview 显示不正确。

这看起来很愚蠢,但我不确定如何解决这个问题。有人可以帮忙吗?谢谢。

最佳答案

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

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

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 年有了自动布局引擎,我还是喜欢完全程序化的布局。

关于IOS 动画与 ViewWillLayoutSubview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132321/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com