问题是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中更改帧所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)