UISearchDisplayController没有调光?

时间:2010-08-20 03:12:35

标签: ios ipad

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

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

提前致谢。

4 个答案:

答案 0 :(得分:11)

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

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

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

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

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate, UITableViewDelegate, UITableViewDataSource> {

    UIPopoverController *popoverController;
    UIToolbar *toolbar;

    id detailItem;
    UILabel *detailDescriptionLabel;

    IBOutlet UIViewController* _searchAreaViewController;
}

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

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

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

祝你好运!

答案 1 :(得分:1)

iOS 8 +

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

iOS 7

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

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

答案 2 :(得分:0)

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

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

我尝试了两种解决方法:

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

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

答案 3 :(得分:0)

我知道我迟到了,这在这里是一个可怕的想法,但是#sethidden:No&#39;不适合我。

-(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];
                           }


                       }
                   }
               }
           }
       }
   }
}