我的代码在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);
每个键盘的位置在某些点上仍会覆盖textview。我也试过设置一个高度约束并操纵常量,但没有运气。
self.height.constant = self.height.constant - 240.0;
(其中height
是约束的出口。)
这些都是在[self.textField becomeFirstResponder];
来电之前和之后尝试过的。
我怎么做到这一点?我只想要一个全屏UITextView,其中插入的东西不会出现在键盘下面,但是在iOS 7下它的基本功能似乎很疯狂。
答案 0 :(得分:3)
在iOS7之前执行此操作的“正确”方法一直是在键盘显示或隐藏时调整UITextView(UIScrollView子类)的contentInset属性。我没有亲自调查,但这似乎在iOS7中不能很好地工作,因为底部插图要么没有兑现,要么光标仍然在键盘下面有一些问题。 See this question for reference.
如果您正在使用自动布局,并且您想要的只是一个“全屏”文本视图,则只需在键盘显示或隐藏时调整单个约束。这将调整文本视图的高度:
@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的版本,并使其正常工作......
修改强>
Here is another SO question that covers this topic, with a solution.显然,插入符号(光标)出现问题的问题与我上面提到的问题相同。 “正确”的方法,这是设置contentInset属性。因此,对此问题的修复应该可以让您简单地调整contentInset与更改文本视图框架(通过.frame或通过约束)。
编辑2
最后一想到这一点。在iOS7中,键盘是半透明的。用户应该能够看到键盘后面的内容。通过将UITextView的大小调整为位于键盘上方,这种情况永远不会发生。所以“正确”的解决方案仍然是调整文本视图底部的contentInset,将键盘的高度添加到文本视图的可滚动区域。然后,在理想的世界中,您将调整文本视图的contentOffset,以便在键盘出现时将插入符保持在视图中。最后,添加“修复”以在显示但是用户输入换行符时将插入符号保持在键盘上方的位置。
答案 1 :(得分:1)
iOS7中的解决方案是将tableview放入容器视图中,这将成为您的主视图。您可以为其添加约束,以使其附加到topLayoutGuide
。添加第二个占位符视图,该视图限制在顶部的表格底部,以及底部的bottomLayoutConstraint
。向此占位符视图添加约束,使其高度为0,并保持指向它的ivar。您可以提供一个UITableViewController子类,用实际的tableview覆盖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;
}
您需要做的是在键盘弹出之前,或者只是总是创建一个空的容器视图并将其添加到该表中,将表添加到该视图中,添加