在 iOS 5 中,有没有办法永远不隐藏搜索栏UITableViewController
?
问问题
1360 次
2 回答
7
UITableViewController
那时我不会推荐 a ,UIViewController
a在它上面而不是在标题上的 a 就可以完成这项工作。在更个人的观点中,我不会推荐任何东西,我觉得它对它真正提供的东西太严格了。如果出于某种原因我正在使用 a并且客户要求我在屏幕上添加一个新元素,那我基本上就完蛋了。UITableVIew
UISearchBar
UITableViewController
UITableViewController
于 2012-06-27T13:35:35.807 回答
0
我知道这是一个老问题,但我找到了一个解决方案,它适用于经典的 UITableViewController 和 UTSearchDisplayController。
我为 searchBar 1st 创建了一个容器视图,然后将搜索栏放入其中。容器不得裁剪到边界。在此之后,您可以更改搜索栏相对于容器的位置。这样做的一个问题是,搜索栏无法处理用户交互。所以我们需要使用我们自己的容器来获取低于其真实框架的事件。
我们的容器类:
@interface _SearchContainerView : UIView
@end
@implementation _SearchContainerView
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (self.subviews.count > 0) {
UISearchBar *searchBar = (UISearchBar *) self.subviews[0];
CGRect f = searchBar.frame;
f = CGRectMake(0, 0, f.size.width, f.origin.y + f.size.height);
if (CGRectContainsPoint(f, point)) return YES;
}
return [super pointInside:point withEvent:event];
}
@end
如果您以编程方式创建 searchBar,则可以使用以下类似代码进行设置:
- (void)setSearchEnabled:(BOOL)searchEnabled {
if (searchBar == nil && searchEnabled) {
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)];
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar
contentsController:self];
searchBar.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin
| UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
searchContainer = [[_SearchContainerView alloc] initWithFrame:searchBar.frame];
[container addSubview:searchBar];
container.clipsToBounds = NO;
self.tableView.tableHeaderView = container;
} else {
[searchBar removeFromSuperview];
self.tableView.tableHeaderView = nil;
searchBar = nil;
searchDisplayController = nil;
searchContainer = nil;
}
}
然后可以根据tableView的滚动位置来改变位置:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (searchBar == nil || searchDisplayController.isActive) return;
CGRect b = self.tableView.bounds;
// Position the searchbar to the top of the tableview
searchBar.frame = CGRectMake(0, b.origin.y, b.size.width, 44);
}
最后一部分是搜索后恢复所有内容:
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
// Restore header alpha
searchContainer.alpha = 1.0;
// Place the searchbar back to the tableview
[searchBar removeFromSuperview];
[searchContainer addSubview:searchBar];
// Refresh position and redraw
CGPoint co = self.tableView.contentOffset;
[self.tableView setContentOffset:CGPointZero animated:NO];
[self.tableView setContentOffset:co animated:NO];
}
于 2015-01-05T17:05:32.303 回答