gpt4 book ai didi

iOS - subview 不使用帧更改进行动画处理

转载 作者:可可西里 更新时间:2023-11-01 06:23:00 24 4
gpt4 key购买 nike

我有一个 View ,我试图在键盘向上滑动时为高度变化设置动画(代码如下所示)。我称之为框架变化的 View 是完美的动画;但是,该 View 包含一个 subview ,该 subview 又包含一个文本字段(这会导致键盘弹出),并且这些 subview 只是跳转到它们的新位置而不是动画。我在 subview 上放置了自动布局约束,以将其限制在父 View 的左侧、底部和右侧,并保持恒定的高度。

示例视频在这里:http://youtu.be/EmcZ-cXeTbM

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(slideViewForKeyboard:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(slideViewForKeyboard:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)slideViewForKeyboard:(NSNotification *)note {
NSDictionary* userInfo = [note userInfo];

// Get animation info from userInfo
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;

[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];

CGRect newFrame = CGRectMake(self.view.frame.origin.x,
self.view.frame.origin.y,
self.view.frame.size.width,
keyboardEndFrame.origin.y);

[UIView animateWithDuration:0 delay:0 options:(animationCurve << 16) animations:^{
[self.view setFrame:newFrame];
}completion:^(BOOL completed){}];
}
- (IBAction)endEditingOnTap:(UITapGestureRecognizer *)sender {
[self.view endEditing:YES];
}

@end

最佳答案

您应该使用 animationDuration 作为动画 block 的持续时间。

除此之外,您还有另一个问题。现在,您在动画 block 中设置了 View 的框架,因此更改是动画的。但是系统稍后会在运行循环的布局阶段在动画 block 之外布置 subview 。这意味着 subview 不会针对它们的新帧进行动画处理。

您可以通过将 layoutIfNeeded 发送到动画 block 内的 View 来解决此问题:

[UIView animateWithDuration:animationDuration delay:0 options:(animationCurve << 16) animations:^{
self.view.frame = newFrame;
[self.view layoutIfNeeded];
} completion:^(BOOL completed){}];

但是您可能会遇到另一个问题。您正在直接设置 View 的框架,但您使用的是自动布局。在某些时候,自动布局可能会根据您的约束设置框架。您需要修改 View 上的约束以控制其新框架,而不是直接设置框架。

关于iOS - subview 不使用帧更改进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26169362/

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