UISearchDisplayController没有调光?

我正在编写一个SplitView iPad应用程序。 在DetailViewController中,有一个包含UITableViewUISearchBar及其控制器的小视图。 此视图不代表为DetailViewController保留的整个屏幕空间。 实际上,它只使用了一半。 另一半有一个UIImageView

这就是麻烦的来源:每次我使用搜索栏时,displaycontroller(我都假设)会使DetailViewController中的所有内容变暗,包括图像视图。 这与人们在运行应用程序时的期望不一致。 有没有办法将框架设置为暗灰色? 或者至少禁用调光效果好?

提前致谢。

你是正确的,正是UISearchDisplayController正在管理你所看到的“调光”效果。

UISearchDisplayController正在做的是将一个UIControl作为子视图添加到searchContentsController(UISearchDisplayController的一个属性)的视图中,这可能是您的详细视图控制器。 这个UIControl只是一个灰色背景的alpha’d视图。 它似乎有一个触摸式内部事件处理程序,在点击时结束搜索。

要将调光效果限制在细节视图的子视图中,您需要做三件事。 (我假设您的详细视图控制器是通过xib定义的。如果没有,这些步骤也可以在代码中完成。)

1)在你的detail-view-controller xib中添加一个新的UIViewController。 将此新视图控制器附加到详细视图控制器的IBOutlet。 在我的例子中,我称之为“_searchAreaViewController”。 这很重要,即使你不会访问视图控制器(但请记住,你必须在某个时候释放它)

 @interface DetailViewController : UIViewController  { UIPopoverController *popoverController; UIToolbar *toolbar; id detailItem; UILabel *detailDescriptionLabel; IBOutlet UIViewController* _searchAreaViewController; } 

2)使搜索区域的包含视图成为这个新视图控制器的视图。 要执行此操作,请使用Interface Builder通过将sockets拖动到searchAreaViewController并选择“视图”sockets来为此视图设置新的参考sockets。 你必须有一个包含视图 – 它应该是你的详细视图的子视图,它应该包含UISearchBar,可能包含你的UITableView。

3)使UISearchDisplayController的searchContentsController属性引用这个新的视图控制器而不是detail-view-controller。 这只能通过Interface Builder来完成,因为属性是只读的(IB有一些神奇的function可以使它工作吗?)如果你需要通过代码执行这一步,你必须inheritanceUISearchDisplayController并从中返回正确的值。属性覆盖“searchContentsController”。

我做了一个示例应用程序来演示这个,我必须添加到SplitView模板的唯一代码行是上面步骤1中列出的代码。 其他一切只是添加视图/控制器并在IB中正确连接它们。

祝你好运!

iOS 8+

  [[UIView appearanceWhenContainedInInstancesOfClasses:@[NSClassFromString(@"UISearchDisplayControllerContainerView")]] setHidden:YES]; 

IOS 7

  [View appearanceWhenContainedIn:NSClassFromString(@"UISearchDisplayControllerContainerView"), nil] setHidden:YES]; 

我知道,UISearchDisplayController目前已被弃用,但如果你仍然需要使用它,你可以完美地用一行代码来解决你的问题。 将其添加到viewDidLoad方法。

你能用“使用搜索栏”和“使所有存在的东西变暗”来澄清你的意思吗? 我解释你所写的内容,当你要在搜索栏的文本字段中输入文本时弹出键盘。 此时,细节视图变暗,阻止用户交互。

原因是搜索栏实现了一个modal dialog,只要显示键盘,就会阻止用户与视图交互。 不幸的是,似乎没有任何方法来配置搜索栏以防止此行为。 另一方面,我不确定用户是否会期望这种行为,因为搜索栏是模态一致的,并且在iOS下通常表现得像这样。

我尝试了两种解决方法:

1.) UIViewController有一个名为modalPresentationStyle的属性,如果它具有值UIModalPresentationFormSheet (“所有未被覆盖的区域都变暗以防止用户与它们交互”, modalPresentationStyle产生您描述的行为。,请参阅Apple文档 )。 但是将此属性设置为不同的值不会改变结果(至少对我来说它不起作用)。

2.)您需要编写自己的非模态搜索栏替换,因为标准UITextField是非模态的,因此不会使任何其他UI元素变暗。 这种方法有效,但您可能需要更多工作才能使其看起来像“常规”搜索栏。 但是,同样,由于此搜索栏的行为与iOS中的模态普通搜索栏的行为不同,这可能并不是用户所期望的。

我知道我迟到了,这是一个可怕的想法,但是’setHidden:No’对我来说不起作用。

 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { BOOL hasBeenremoved = NO; hasBeenremoved = [[[[NSThread mainThread] threadDictionary] objectForKey:@"hasBeenremoved"] boolValue]; if (hasBeenremoved) { UIView* dimmingView = nil; dimmingView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingView"]; UIView* dimmingViewSuperView = nil; dimmingViewSuperView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingViewSuperView"]; [dimmingViewSuperView addSubview:dimmingView]; [[[NSThread mainThread] threadDictionary] setObject:@NO forKey:@"hasBeenremoved"]; } if ([searchText length] == 0 || [searchText isEqualToString:@""] ) { [searchBar becomeFirstResponder]; [[[self primarySearchDisplayController] searchResultsTableView] reloadData]; [[[self primarySearchDisplayController] searchResultsTableView] setHidden:NO]; for( UIView *subview in self.view.subviews ) { if([subview isMemberOfClass:[UIControl class]] || ([[[subview class] description] isEqualToString:@"UISearchDisplayControllerContainerView"])) { for(UIView *subView2 in subview.subviews) { for(UIView *subView3 in subView2.subviews) { if (subView3.alpha < 1) { if ([[[subView3 class] description] isEqualToString:@"_UISearchDisplayControllerDimmingView"]) { [[[NSThread mainThread] threadDictionary] setObject:subView3 forKey:@"dimmingView"]; [[[NSThread mainThread] threadDictionary] setObject:subView3.superview forKey:@"dimmingViewSuperView"]; [[[NSThread mainThread] threadDictionary] setObject:@YES forKey:@"hasBeenremoved"]; [subView3 removeFromSuperview]; } } } } } } } }