我一直在努力解决这个问题超过一周,并在Stackoverflow和互联网上尝试了大量的解决方案,但我似乎没有找到解决方案......
首先,我有一个复杂的视图层次结构。每个视图包含三个子视图。标题,中心和页脚。中心视图包含一个tableview。我喜欢这样,因为我希望页眉和页脚始终可见。
现在我想要检查我的键盘是否隐藏了要编辑的文本字段。如果是这样,滚动表格视图,使文本字段位于表格的顶部,以便更好地进行编辑。
但我无法让它发挥作用。我现在开始编写我自己的类,但现在我在使用框架大小。首先,这是我的代码:
@implementation MovingTextFieldsIntoViewTableView
@synthesize activeField = _activeField;
@synthesize activeCellIndexPath = _activeCellIndexPath;
@synthesize tableFrameInMainView = _tableFrameInMainView;
@synthesize completeScreen = _completeScreen;
#pragma mark move textfield into view
// Call this method somewhere in your view controller setup code.
//If this isn't called the table view acts as a normal table view
// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
}
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGRect keyboard = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
//UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
//self.contentInset = contentInsets;
//self.scrollIndicatorInsets = contentInsets;
CGRect visiblePartOfScreen = self.completeScreen;
visiblePartOfScreen.size.height -= keyboard.size.height;
CGRect rectOfCellInTableView = [self rectForRowAtIndexPath:self.activeCellIndexPath];
CGFloat textFieldBottomY = self.tableFrameInMainView.origin.y - self.contentOffset.y + rectOfCellInTableView.origin.y + self.activeField.frame.origin.y + self.activeField.frame.size.height;
NSLog(@"textFieldBottomY: %f", textFieldBottomY);
NSLog(@"Screen size: %f", self.completeScreen.size.height);
NSLog(@"keyboar height: %f", keyboard.size.height);
NSLog(@"visible screen size: %f", visiblePartOfScreen.size.height);
CGPoint activeFieldBottomY = CGPointMake(self.activeField.frame.origin.x, textFieldBottomY);
if (CGRectContainsPoint(visiblePartOfScreen, activeFieldBottomY)) {
NSLog(@"Keyboard does NOT hide textfield");
} else {
NSLog(@"Keyboard does hide textfield");
}
// if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
// [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
// }
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
// UIEdgeInsets contentInsets = UIEdgeInsetsZero;
// scrollView.contentInset = contentInsets;
// scrollView.scrollIndicatorInsets = contentInsets;
}
@end
正如您所看到的,我只想先看看我的功能是否正确识别某个文本字段是否隐藏。但这并不完全有效。 问题必须是其中一个属性:
在开始编辑中直接设置activeField(如Apple的示例中所示)。
activeCellIndexPath设置在与活动字段相同的位置(带有文本字段的标记)
tableFrameInMainView:在主视图控制器的相应viewDidLoad方法中,我正在设置与主视图相关的表格框架。这似乎有效,并且给出了与接口构建器中设置的完全相同的值和约束。
completeScreen:这里我希望没有键盘的屏幕可见框架。这个似乎是问题,因为我猜这个有点大(可能是因为导航栏?或者tabbar?)如你所见我需要这个以便找出keyboardSize屏幕的哪一部分(带内容)可见,哪一部分是隐藏的。我如何获得正确的价值?我的内容未延伸到导航栏或标签栏下方。我的意思是在3.5英寸iPhone的模拟器中,键盘大约覆盖了屏幕内容的一半。但是keyBoard高度是216,而我的completeScreen.height记录480 ...
编辑: 我现在检查导航栏的高度,它是0.这是我猜的因为NSLog(@“%@”,self.navigationController);从我的视图控制器得到null ...但是这没有任何意义,因为我的导航控制器正在工作,我已经在XCode Interface Builder中设置了所有内容?!
答案 0 :(得分:0)
我不确定这是否能彻底解决您的问题,但我可能会给您一些建议。
你的类是继承自UIViewController吗?
我最近遇到了类似的问题,并在1-2小时内通过继承UITableViewController解决了,该类已代表我完成所有工作。 我只是不确定你是否可以这样做,然后添加所有其他视图,但我想这应该是可能的。
在我的情况下,我有一个“+”UIBarButton,当用户点击它时,在表的末尾添加一个包含UITextField的新单元格,文本字段也应该成为第一响应者,以及相应滚动的表视图。这就是我的方式:
- (void)onBarButtonAddFolderTap:(UIBarButtonItem *)sender
{
PPFolder *newFolder = [[PPFolder alloc] initWithName:@""];
[[SessionManager sharedManager] addFolder:newFolder];
NSIndexPath *indexPathForNewFolder = [NSIndexPath indexPathForRow:([[SessionManager sharedManager].folders count] - 1) inSection:0];
[self.tableViewFolders insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathForNewFolder]
withRowAnimation:UITableViewRowAnimationLeft];
[self.tableViewFolders scrollToRowAtIndexPath:indexPathForNewFolder atScrollPosition:UITableViewScrollPositionBottom animated:NO];
PPFolderCell *folderCell = [self cellForRow:indexPathForNewFolder.row];
[folderCell.textFieldFolderName becomeFirstResponder];
}
尝试继承UITableViewController并执行类似的操作。 我希望以某种方式帮助你:)
答案 1 :(得分:0)
此代码可以帮助您:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 100.0f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 100.0f;
}
// custom view for header. will be adjusted to default or specified header height
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *viewForHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
viewForHeader.backgroundColor = [UIColor orangeColor];
return viewForHeader;
}
// custom view for footer. will be adjusted to default or specified footer height
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
UIView *viewForFooter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
viewForFooter.backgroundColor = [UIColor orangeColor];
return viewForFooter;
}