我有一个旧的ObjC iOS 9.3应用程序,我正在更新到iOS 12和iPhone X系列。 主视图是一个UIViewController,具有使用STCollapseTableView的嵌入式UITableView。该表具有自定义的UISearchController,该UISearchController通过带有带有除了常用的textField和Cancel按钮之外的按钮的segmentedControl的搜索栏进行定制。表格最初会向上偏移搜索块的高度以将其隐藏起来,直到用户将表格向下拖动为止。一切都很原始,并且在较旧的操作系统上运行正常。
现在: 在ViewDidLoad&Appear上可以很好地显示tableview的初始显示。 初始拖动表格即可,搜索栏仅显示所需的文本字段和取消按钮。 第一个问题:点击文本框以获取焦点,然后在其中移动搜索条目文本框并取消按钮,在其下根据需要绘制分段控件,然后将整个搜索栏向上移动到Nav区域中,大约等于搜索栏加按钮的高度。这会将tableView与填充背景空白的搜索栏分开。 此时,“取消”按钮仍然有效,其操作会将表格视图移回搜索栏。
文本输入以及搜索和限制功能仍然可以正常工作,并适当地填充表格视图。
第二个大问题:用户从搜索结果中选择了一个详细视图并返回到主表视图后,搜索栏现在在导航/状态栏内进一步偏移,其中(iPhoneX)凹口下方的文本字段和“取消”电池状态下的按钮,并且无法触摸;或者iPhone8的屏幕上方几乎看不到带有搜索栏的iPhone8,已超过安全区域。这种升级发生在iOS 12设备上,而不是在iOS 10.3.3设备上。
以下是相关代码: MainVC中的搜索控制器定义
// Here's where we create our UISearchController
self.MySearchResultsController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.MySearchResultsController.searchResultsUpdater = self;
self.MySearchResultsController.searchBar.delegate = self;
UITextInputAssistantItem* item = [self.MySearchResultsController inputAssistantItem];
item.leadingBarButtonGroups = @[];
item.trailingBarButtonGroups = @[];
self.MySearchResultsController.searchBar.scopeButtonTitles = @[@"",@"",@"",@""];
id temp = [UISegmentedControl appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]];
UIImage * img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 1];
img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 3];
img = [UIImage imageNamed:@""];
[temp setImage:img forSegmentAtIndex: 2];
self.MySearchResultsController.searchBar.showsScopeBar = YES;
self.MySearchResultsController.searchBar.keyboardType = UIKeyboardTypeASCIICapable;
[self.MySearchResultsController.inputAccessoryView reloadInputViews];
[self.MySearchResultsController.searchBar sizeToFit];
// Add the UISearchBar to the top header of the table view
self.tableView.tableHeaderView = self.MySearchResultsController.searchBar;
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.MySearchResultsController.searchBar.frame.size.height)];
// It is usually good to set the presentation context.
self.definesPresentationContext = YES;
self.MySearchResultsController.obscuresBackgroundDuringPresentation = NO;
self.MySearchResultsController.dimsBackgroundDuringPresentation = NO;
if (@available(iOS 11.0, *)) {
self.navigationController.navigationItem.searchController = _MySearchResultsController;
self.navigationController.navigationItem.hidesSearchBarWhenScrolling = false;
[self.MySearchResultsController setActive:YES];
} else {
self.tableView.tableHeaderView = self.MySearchResultsController.searchBar;
// [self presentSearchController:_MySearchResultsController];
}
Main TableVC中的另一个功能是detailVC的展开
-(IBAction)unwindFromNewDetailViewController:(UIStoryboardSegue *) segue {
NewDetailViewController *dVC = [segue sourceViewController];
NSIndexPath *newPath = dVC.returningIndexPath;
if (newPath == nil) {
newPath = [NSIndexPath indexPathForRow:(NSInteger)0 inSection:(NSInteger)0];
}
if (_inFilterMode) {
newPath = _selectedIndexPath;
[self.tableView setContentOffset:CGPointMake(0, self.MySearchResultsController.searchBar.frame.size.height)];
}
[self.tableView reloadData];
[self.tableView openSection:newPath.section animated:YES];
[self.tableView scrollToRowAtIndexPath:newPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
这是从DetailVC返回的内容:viewWillDisappear {}
if (_inSearchMode) {
p = [NSIndexPath indexPathForRow:(NSInteger)0 inSection:(NSInteger)0];
}
[self performSegueWithIdentifier:@"unwindNewDetailToMainTable" sender:self];
[super viewWillDisappear:YES];
对于我的错误编码或如何在屏幕上强制重新放置searchBar和navBar的任何想法,我将不胜感激。