7

我的代码在 iOS 6 下运行良好,但在 iOS 7 下我似乎无法让我的 UITextView 成为设备屏幕减去键盘的高度(换句话说,当键盘启动时,让 UITextView 仍然是全屏的,但是不要进入键盘下方)。

一方面,当我将 UITextView 放入我的视图控制器(嵌入在导航控制器中)时,它也必须位于导航栏下方,否则它开始太低了。

从那里我尝试了所有这些示例:

self.textView.contentInset = UIEdgeInsetsMake(0, 0, 230, 0);
self.textView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 230, 0);
self.textView.textContainerInset = UIEdgeInsetsMake(0, 0, 230, 0);

每个键盘在某些点上仍然会越过文本视图。我还尝试设置高度约束并操纵常数,但没有运气。

self.height.constant = self.height.constant - 240.0;

height(约束的出口在哪里。)

这些都在通话前后都试过了[self.textField becomeFirstResponder];

我该如何做到这一点?我只想要一个全屏 UITextView,其中插入符号的东西不会在键盘下,但它这样的基本功能在 iOS 7 下似乎很疯狂。

4

2 回答 2

3

在 iOS7 之前执行此操作的“正确”方法一直是在键盘显示或隐藏时调整 UITextView(UIScrollView 子类)的 contentInset 属性。我没有亲自调查过,但这似乎在 iOS7 中效果不佳,因为底部插图要么不被尊重,要么光标仍然在键盘下方存在一些问题。 请参阅此问题以供参考。

在您使用自动布局的情况下,您想要的只是“全屏”文本视图,您可以在键盘显示或隐藏时简单地调整单个约束。这将调整文本视图的高度:

@implementation TSViewController
{
    IBOutlet NSLayoutConstraint* _textViewSpaceToBottomConstraint;
}

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver: self];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

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

- (void) keyboardWillShow: (NSNotification*) n
{
    NSValue* bv = n.userInfo[UIKeyboardFrameEndUserInfoKey];
    CGRect br = [bv CGRectValue];

    _textViewSpaceToBottomConstraint.constant = br.size.height;
}

- (void) keyboardWillHide: (NSNotification*) n
{
    _textViewSpaceToBottomConstraint.constant = 0;
}

@end

在情节提要中,将 UITextView 放在视图控制器视图上,并添加 4 个约束以将其边缘粘合到视图控制器视图的边缘。将底部空间约束连接到视图控制器中的 IBOutlet _textViewSpaceToBottomConstraint。

您可能会稍微玩一下并调整动画块内的大小,从键盘通知中借用动画时间和曲线。

我有兴趣看到一个设置 contentInset 并让它正常工作的版本......

在此处输入图像描述

编辑

这是另一个涵盖此主题的 SO 问题,并提供了解决方案。 显然插入符号(光标)超出框架的问题与我上面提到的问题相同。执行此操作的“正确”方法是设置 contentInset 属性。因此,此问题的修复应该使您能够简单地调整 contentInset 与更改文本视图框架(通过 .frame 或通过约束)。

编辑 2

关于这一点的最后一个想法。在 iOS7 中,键盘是半透明的。用户应该能够看到键盘后面的内容。通过将 UITextView 的大小调整到键盘上方,这将永远不会发生。所以“正确”的解决方案仍然是调整文本视图底部的contentInset,将键盘的高度添加到文本视图的可滚动区域。然后,在理想情况下,您将调整文本视图的 contentOffset 以在键盘出现时保持插入符号在视图中。最后,添加“修复”以在显示插入符号但用户输入换行符时将插入符号保持在键盘上方的位置。

于 2013-11-04T17:47:38.647 回答
1

在 iOS7 中解决这个问题的方法是将 tableview 放入一个容器视图中,它成为你的主视图。您可以为其添加约束,使其附加到topLayoutGuide. 添加第二个占位符视图,该视图被限制在顶部的表格底部和bottomLayoutConstraint底部的 中。向这个占位符视图添加一个约束,使其高度为 0,并保持一个指向它的 ivar。tableView您可以提供一个 UITableViewController 子类,用真实的 tableview覆盖该属性。

当键盘准备弹出时,您可以从通知中获取表格的高度(代码如下),并将constraint占位符视图的属性设置动画到键盘的高度。

键盘通知代码如下:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardWillShowNotification object:nil];
    [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardWillHideNotification object:nil];
    [defaultCenter addObserver:self selector:@selector(keyboardMoving:) name:UIKeyboardDidHideNotification object:nil];
}

-(void)viewWillDisappear:(BOOL)animated
{
    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [defaultCenter removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    [defaultCenter removeObserver:self name:UIKeyboardDidHideNotification object:nil];

    [super viewWillDisappear:animated];
}
- (void)keyboardMoving:(NSNotification *)note
{
    NSString *msg = note.name;

    if([msg isEqualToString:UIKeyboardWillShowNotification] && !_keyboardUp) {
        _keyboardUp = YES;
        [[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&_animationDuration];
        [[note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&_keyboardRect];
        NSLog(@"ORIG KEYBOARD %@", NSStringFromCGRect(_keyboardRect));
        _keyboardRect = [self.view convertRect:_keyboardRect fromView:nil];
        NSLog(@"NEW KEYBOARD %@", NSStringFromCGRect(_keyboardRect));
        _animate = YES;
    } else
    if([msg isEqualToString:UIKeyboardWillHideNotification] && _keyboardUp) {
        _keyboardUp = NO;
        _animate = YES;
    } else
    if([msg isEqualToString:UIKeyboardDidHideNotification]) {
        _keyboardUp = NO;
        _animate = NO;
    }
}

- (BOOL)isKeyboardMovingUp
{
    return _keyboardUp == YES && _animate == YES;
}
- (BOOL)isKeyboardMovingDown
{
    return _keyboardUp == NO && _animate == YES;
}

- (BOOL)isKeyboardDown
{
    return _keyboardUp == NO && _animate == NO;
}

您需要做的是在键盘弹出之前,或者总是创建一个空容器视图并将其添加到,将表添加到该视图,添加

于 2013-10-28T02:45:17.597 回答