ios – 在viewDidLayoutSubviews中更改帧

ios – 在viewDidLayoutSubviews中更改帧,第1张

概述首次显示视图控制器的视图时,我想运行一个动画,其中视图控制器中的所有元素从屏幕底部外部滑动到其自然位置.为此,我在viewDidLayoutSubviews中执行subview.frame.origin.y = self.view.frame.size.height.我也尝试过viewWillAppear,但它根本不起作用.然后我使用viewDidAppear中的subview.frame.ori 首次显示视图控制器的视图时,我想运行一个动画,其中视图控制器中的所有元素从屏幕底部外部滑动到其自然位置.为此,我在vIEwDIDLayoutSubvIEws中执行subvIEw.frame.origin.y = self.vIEw.frame.size.height.我也尝试过vIEwWillAppear,但它根本不起作用.然后我使用vIEwDIDAppear中的subvIEw.frame.origin.y – = self.vIEw.frame.size.height将它们设置为自然位置.

问题是vIEwDIDLayoutSubvIEws在整个视图控制器的生命周期中被调用了好几次.因此,当显示键盘的事情发生时,我的所有内容都会再次在视图之外被替换.

这样做有更好的方法吗?我是否需要添加某种标志来检查动画是否已经运行?

编辑:这是代码.这里我在vIEwDIDLayoutSubvIEws中调用prepareAppearance,它可以工作,但是在整个控制器的生命周期中多次调用vIEwDIDLayoutSubvIEws.

- (voID)vIEwDIDLayoutSubvIEws{    [super vIEwDIDLayoutSubvIEws];    [self prepareAppearance];}- (voID)vIEwDIDAppear:(BOol)animated{    [super vIEwDIDAppear:animated];    [self animateAppearance];}- (NSArray *)animatableVIEws{    return @[self.createAccountbutton,self.facebookbutton,self.linkedInbutton,self.loginbutton];}- (voID)prepareAppearance{    NSArray * vIEws = [self animatableVIEws];    NSUInteger count = [vIEws count];    for (NSUInteger it=0 ; it < count ; ++it) {        UIVIEw * vIEw = [vIEws objectAtIndex:it];        CGRect frame = vIEw.frame;        // Move the vIEws outsIDe the screen,to the bottom        frame.origin.y += self.vIEw.frame.size.height;        [vIEw setFrame:frame];    }}- (voID)animateAppearance{    NSArray * vIEws = [self animatableVIEws];    NSUInteger count = [vIEws count];    for (NSUInteger it=0 ; it < count ; ++it) {        __weak UIVIEw * weakVIEw = [vIEws objectAtIndex:it];        CGRect referenceFrame = self.vIEw.frame;        [UIVIEw animateWithDuration:0.4f                              delay:0.05f * it                            options:UIVIEwAnimationoptionCurveEaSEOut                         animations:^{                             CGRect frame = weakVIEw.frame;                             frame.origin.y -= referenceFrame.size.height;                             [weakVIEw setFrame:frame];                         }                         completion:^(BOol finished) {                         }];    }}
解决方法 如果您需要在显示视图时为某些内容设置动画,然后不再触摸子视图,我建议如下:

>请勿更改/触摸vIEwDIDLayoutSubvIEws
>在vIEwWillAppear中添加逻辑以在屏幕外移动元素(到动画前的初始位置)
>添加逻辑以将元素设置为vIEwDIDAppear中的正确位置

更新:

如果您正在使用自动布局(这是非常好的事情),您无法通过直接更改其框架来动画视图(因为自动布局会忽略它并再次更改它们).您需要做的是将出口暴露给负责Y位置的约束(在您的情况下)并更改约束而不是设置框架.

在动画方法中更新约束后,也不要忘记包含对[weakVIEw layoutIfNeeded]的调用.

总结

以上是内存溢出为你收集整理的ios – 在viewDidLayoutSubviews中更改帧全部内容,希望文章能够帮你解决ios – 在viewDidLayoutSubviews中更改帧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存