gpt4 book ai didi

ios - 在 viewDidLayoutSubviews 中更改框架

转载 作者:可可西里 更新时间:2023-11-01 03:30:29 26 4
gpt4 key购买 nike

当 View Controller 的 View 首次显示时,我想运行一个动画,其中 View Controller 中的所有元素都从屏幕底部外部滑动到它们的自然位置。为此,我在 viewDidLayoutSubviews 中执行了 subview.frame.origin.y += self.view.frame.size.height。我也尝试了 viewWillAppear,但它根本不起作用。然后,我使用 viewDidAppear 中的 subview.frame.origin.y -= self.view.frame.size.height 将它们设置为自然位置。

问题是 viewDidLayoutSubviews 在 View Controller 的整个生命周期中被多次调用。因此,当显示键盘之类的事情发生时,我的所有内容都会再次被替换到 View 之外。

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

编辑:这是代码。在这里,我在 viewDidLayoutSubviews 中调用了 prepareAppearance,这有效,但是 viewDidLayoutSubviews 在 Controller 的整个生命周期中被多次调用。

- (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) {
}];
}
}

最佳答案

如果您需要在 View 出现时对某些内容进行动画处理,然后稍后再不触摸 subview ,我建议如下:

  • 不要更改/触摸 viewDidLayoutSubviews
  • viewWillAppear
  • 中添加逻辑以将元素移动到屏幕外(移动到它们的初始位置 before 动画)
  • viewDidAppear 中添加逻辑以将元素动画化到它们的正确位置

更新:

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

在动画方法中更新约束后,不要忘记调用 [weakView layoutIfNeeded]

关于ios - 在 viewDidLayoutSubviews 中更改框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27110242/

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