我意识到有许多类似的解决方案,例如TPKeyboardAvoidingApple着名的解决方案 ,以及涉及使用UIScrollView的各种建议。 在我的情况下,我需要调整视图大小以适应键盘而不是滚动或移动它。 这个解决方案最接近我想要达到的目标,所以这是我的基础。 但是我在横向模式下工作时遇到了问题。 键盘出现时调整视图大小的方法是:

- (void)keyboardWillShow:(NSNotification *)note {
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];

    CGRect keyboardFrame = [[self textField].superview convertRect:[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
    CGRect statusBarFrame = [[self textField].superview convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil];

    CGRect bounds = [self textField].superview.bounds;    
    CGRect newFrame = CGRectMake(0.0, 0.0, bounds.size.width, keyboardFrame.origin.y + statusBarFrame.size.height);
    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        [self textField].superview.frame = newFrame;
    } completion:nil];
}

这在肖像模式下完美运行。

在此输入图像描述

但是,在横向模式下,视图会从左到右或从右到左调整大小,具体取决于设备旋转的方向,而不是从下向上。

在此输入图像描述

显然我使用坐标有些不对劲,而且在横向模式下,某些参考框架并不是我认为的那样,但我有一点时间整理出如何解决它。 我尝试用-convertRect转换各种各样的东西:但是我正在尝试的任何东西都让我无处可去。

我真的希望有人不会对所有这些矩形感到困惑,以及当方向变化时他们如何改变可以发现我做错了什么以及我需要做些什么才能做到这一点。 作为参考,我创建了一个项目,显示了最简单的情况,可以重现我遇到的问题。

===============>>#1 票数:27 已采纳

我不建议您为视图控制器调整根视图的大小,您可以创建contentView并添加到视图控制器的视图。 你可以改变这个contentView的大小如下(我不使用autolayouting):

- (void)keyboardWillShow:(NSNotification *)note {
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];

    CGRect keyboardFrameEnd = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd fromView:nil];

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        self.contentView.frame = CGRectMake(0, 0, keyboardFrameEnd.size.width, keyboardFrameEnd.origin.y);
    } completion:nil];
}

- (void)keyboardWillHide:(NSNotification *)note {
    NSDictionary *userInfo = note.userInfo;
    NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];

    CGRect keyboardFrameEnd = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd fromView:nil];

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
        self.contentView.frame = CGRectMake(0, 0, keyboardFrameEnd.size.width, keyboardFrameEnd.origin.y);
    } completion:nil];
}

===============>>#2 票数:5

Vitaliy B的答案很快。 我有一个名为templateHeaderContentView的视图,我创建了一个函数并在那里配置了视图高度。 您可以使用自己的视图并相应地更改高度。

func keyboardWillShow(notification: NSNotification) {
    keyboardShowOrHide(notification)
}

func keyboardWillHide(notification: NSNotification) {
    keyboardShowOrHide(notification)
}

private func keyboardShowOrHide(notification: NSNotification) {
    guard let userInfo = notification.userInfo else {return}
    guard let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey]else { return }
    guard let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] else { return }
    guard let keyboardFrameEnd = userInfo[UIKeyboardFrameEndUserInfoKey] else { return }

    let curveOption = UIViewAnimationOptions(rawValue: UInt(curve.integerValue << 16))
    let keyboardFrameEndRectFromView = view.convertRect(keyboardFrameEnd.CGRectValue, fromView: nil)
    UIView.animateWithDuration(duration.doubleValue ?? 1.0,
        delay: 0,
        options: [curveOption, .BeginFromCurrentState],
        animations: { () -> Void in
            self.templateHeaderContentView.configureView(keyboardFrameEndRectFromView.origin.y)
        }, completion: nil)
}

===============>>#3 票数:2

马嘴盖得很好直:

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

===============>>#4 票数:1

我已经做到了希望这段代码对你有所帮助。

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

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
}

- (void)keyboardWillShow:(NSNotification*)notification
{
    [self moveControls:notification up:YES];
}

- (void)keyboardWillBeHidden:(NSNotification*)notification
{
    [self moveControls:notification up:NO];
}

- (void)moveControls:(NSNotification*)notification up:(BOOL)up
{
    NSDictionary* userInfo = [notification userInfo];
    CGRect newFrame = [self getNewControlsFrame:userInfo up:up];

    [self animateControls:userInfo withFrame:newFrame];
}

- (CGRect)getNewControlsFrame:(NSDictionary*)userInfo up:(BOOL)up
{
    CGRect kbFrame = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    kbFrame = [self.view convertRect:kbFrame fromView:nil];

    CGRect newFrame = self.view.frame;
    newFrame.origin.y += kbFrame.size.height * (up ? -1 : 1);

    return newFrame;
}

- (void)animateControls:(NSDictionary*)userInfo withFrame:(CGRect)newFrame
{
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    UIViewAnimationCurve animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];

    [UIView animateWithDuration:duration
                          delay:0
                        options:animationOptionsWithCurve(animationCurve)
                     animations:^{
                         self.view.frame = newFrame;
                     }
                     completion:^(BOOL finished){}];
}

static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCurve curve)
{
    return (UIViewAnimationOptions)curve << 16;
}

===============>>#5 票数:-1

试试这个方法。 根据您的要求进行编辑。

#define kOFFSET_FOR_KEYBOARD 280.0

- (void)keyboardWillHide:(NSNotification *)notif {
    [self setViewMoveUp:NO];
}


- (void)keyboardWillShow:(NSNotification *)notif{
    [self setViewMoveUp:YES];
}


- (void)textFieldDidBeginEditing:(UITextField *)textField {
    stayup = YES;
    [self setViewMoveUp:YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField {
    stayup = NO;
    [self setViewMoveUp:NO];
}

//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMoveUp:(BOOL)moveUp
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3]; // if you want to slide up the view
    [UIView setAnimationBeginsFromCurrentState:YES];

    CGRect rect = self.view.frame;
    if (moveUp)
    {
        // 1. move the view's origin up so that the text field that will be hidden come above the keyboard 
        // 2. increase the size of the view so that the area behind the keyboard is covered up.

        if (rect.origin.y == 0 ) {
            rect.origin.y -= kOFFSET_FOR_KEYBOARD;
            //rect.size.height += kOFFSET_FOR_KEYBOARD;
        }

    }
    else
    {
        if (stayup == NO) {
            rect.origin.y += kOFFSET_FOR_KEYBOARD;
            //rect.size.height -= kOFFSET_FOR_KEYBOARD;
        }
    }
    self.view.frame = rect; 
    [UIView commitAnimations];
}

  ask by bkocik translate from so

未解决问题?本站智能推荐:

4回复

如何在iOS应用程序中同时管理横向和纵向方向?

我们将构建由客户端提供的ios应用程序和图形,如果我们需要同时管理横向和纵向,那么我是否需要从客户端请求两个不同的视图图形? 我是一名业务分析师,因此是半技术的。 我发现视图控制器可以处理该事件,但是我不确定是否需要为纵向和横向模式分离psd文件?
1回复

iOS键盘从计算机输入

我有一个IOS应用程序,如果它可以响应我在计算机上所做的键盘击键,那么它将非常方便进行测试。 有什么办法可行吗? 更多内容:我有一个用图像制作的自定义键盘,当触摸该键盘时,会打印出所按下的字母。 但是,如果我尝试使用计算机键盘键入字母,则仅当使用设备或模拟器手动按字母时,我的自定义键盘
2回复

在iOS 8键盘中选择时检测Smiley和Globe

我需要能够检测用户何时在iPhone和iPad键盘上选择了笑脸和地球仪,以便可以根据是否支持预想文本来调整视图的大小。 我已经尝试过myUITextView和键盘代表,但是没有运气。 谢谢您的帮助
1回复

iOS UISearchBar在第一次点击时不显示键盘

我有一个顶部带有UISearchBar的视图控制器,在显示键盘之前需要进行两次或三次轻按。 它在模拟器和设备上执行此操作。 有人知道是什么原因造成的吗? 有时候我也有UITextField这个问题吗? 谢谢, 我正在为iPad开发并使用Xcode 4.5,并为iOS 5.0和+
1回复

如何在iOS应用程序中添加蓝牙键盘支持?

如何在iOS应用程序中添加蓝牙键盘支持? 只是如何在按下任何键时捕获事件?
1回复

关闭iPad键盘

我正在为iPhone和iPad创建一个iOS应用程序,并且某些屏幕具有UITextFields。 我希望在用户单击文本框后关闭键盘。 为此,我编写了以下代码: 这在iPhone上工作正常,但在iPad上的键盘上无效。 我在网上搜索,所有的建议都行不通。 主要建议是: 但这
7回复

键盘“WillShow”和“WillHide”与旋转

我有一个视图控制器监听UIKeyboardWillShowNotification和UIKeyboardWillHideNotification。 这些通知的处理程序调整视图的各个部分,这是标准过程。 以下代码用于从屏幕坐标转换键盘rect: 再次,标准程序。 不幸的是,存在这
1回复

在某些应用中无法选择日语键盘

大家好! 我一直在努力修复我们正在整个星期工作的一个应用程序中的一个问题,我不知道原因和可能的解决方案。 你能不能帮帮我吧 - 也许有些人遇到了同样的问题: 最初只在一个项目中报告了这个问题,但后来我也尝试在其他应用程序中重现它 - 在一些应用程序中存在相同的问题,在一些项目中正常
1回复

对话框消失时键盘隐藏

在我的应用程序中,我使用sharekit以便在Facebook上发布。在主屏幕上,我有一个textview和一个自定义键盘。 当我单击Facebook按钮时,它将检查用户身份验证令牌,如果当前帖子将发布在Facebook上(如果不是),它将显示一个对话框,以按用户获取用户名和密码。 当我单击
4回复

键盘到位后移动UIScrollView

[编辑:]问题已经解决。 我没有在UIBuilder正确链接我的UIBuilder 。 代码很好! 我想在键盘出现时调整scrollview的大小。 我去了开发人员文档并找到了这些信息。 http://developer.apple.com/library/ios/#docum