Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Animation iOS8:What';在键盘转换过程中,移动视图是怎么回事?_Animation_Ios8_Uikeyboard - Fatal编程技术网

Animation iOS8:What';在键盘转换过程中,移动视图是怎么回事?

Animation iOS8:What';在键盘转换过程中,移动视图是怎么回事?,animation,ios8,uikeyboard,Animation,Ios8,Uikeyboard,切换到iOS8后,在键盘转换期间移动视图时,我会出现奇怪的行为。有人能解释发生了什么事吗 这里有一个简单的例子来说明这个问题。我有一个带有UITextField和ui按钮的简单视图。功能nudgeUp将文本字段和按钮向上移动10点。它由按下的按钮回调触发,或者键盘将显示回调 当我点击按钮时,代码按预期工作:buttonPressed调用nudgeUp,按钮和文本字段跳高10点 当我点击文本字段时,keyboard将显示调用nudgeUp,但行为非常不同。按钮和文本字段立即向下跳10个点,然后在键

切换到iOS8后,在键盘转换期间移动视图时,我会出现奇怪的行为。有人能解释发生了什么事吗

这里有一个简单的例子来说明这个问题。我有一个带有
UITextField
ui按钮的简单视图。功能
nudgeUp
将文本字段和按钮向上移动10点。它由按下的
按钮
回调触发,或者
键盘将显示
回调

当我点击按钮时,代码按预期工作:
buttonPressed
调用
nudgeUp
,按钮和文本字段跳高10点

当我点击文本字段时,
keyboard将显示调用
nudgeUp
,但行为非常不同。按钮和文本字段立即向下跳10个点,然后在键盘显示时滑回其原始位置

为什么会这样?如何在iOS8中的键盘演示期间重新控制动画

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

}

- (void)keyboardWillShow:(NSNotification *)notification
{
    // Called when the keyboard appears.
    [self nudgeUp];
}

- (IBAction)buttonPressed:(id)sender {
    [self nudgeUp];
}

- (void)nudgeUp
{
    CGRect newTextFieldFrame = self.textField.frame;
    newTextFieldFrame.origin.y -= 10;
    self.textField.frame = newTextFieldFrame;

    CGRect newButtonFrame = self.button.frame;
    newButtonFrame.origin.y -= 10;
    self.button.frame = newButtonFrame;
}
@end

您应该使用
UIKeyboardDidShowNotification
(您正在使用的
版本),一切都将按照您的预期工作:

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidShow:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];

}

- (void)keyboardDidShow:(NSNotification *)notification
{
    // Called when the keyboard finished showing up
    [self nudgeUp];
}
原因是使用
ui键盘willshownotification
更改帧太早。更改后,系统将重新显示所有内容以适应键盘,您的更改不会产生任何效果


另外,我建议您切换到autolayout,忘记框架。

尝试使用UIKeyboardWillShowNotification用户信息提供键盘框架。然后在此基础上移动屏幕上的元素。

这是自动布局。iOS8中发生了一些变化,如果启用了自动布局,则不能再仅更改帧或中心点。您必须创建约束(垂直空间)的出口,并相应地更新它,而不是更改帧位置。约束与任何其他ui控件一样,可以有一个出口。约束更改可以设置动画

例如:

[UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0 options:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{        
    self.bottomSpaceConstraint.constant = adjustmentedValue;
    [self.view layoutIfNeeded];        
} completion:^(BOOL finished) {
}];

你的解决方案会按你说的那样做,但我不希望我的动画在键盘完成显示后出现;我不明白我看到的行为怎么会被描述为“重新调整以适应键盘”;我不明白为什么我的代码在iOS7中工作,但在iOS8中却不工作。这就是我一直在做的,它在iOS7中工作得很好。但在iOS8中,它的行为方式与我上面给出的示例代码(简单得多)相同:帧从我告诉它的方式向相反方向跳跃,然后滑回其原始位置。非常感谢您富有洞察力的回答。我在这个问题上悬赏200分。我希望我能把它奖励给你,但是当你回答时,赏金已经过期了。这真的很棘手。我在这个问题上花了好几天的时间,谢谢你提供的信息。我发现这个问题是因为我看到UIKeyboardWillShowNotification从未发布过。(如中所示,addObserver调用中引用的选择器内的断点永远不会命中!)。您是否验证了通知是否确实已发送给您?(我这样问是因为虽然我知道iOS 8和自动布局可能会产生干扰,但我的应用程序已经足够旧了,无法在自动布局的情况下构建)。更新:创建了一个新的单窗口应用程序,其中包含一个文本字段,并且无论自动布局复选框如何,都会发布通知。。。嗯)对不起,我帮不了你。通知肯定是在我的代码中发布的。