UISearchDisplayController без затемнения? - PullRequest
8 голосов
/ 20 августа 2010

Я пишу приложение SplitView для iPad.Внутри DetailViewController есть небольшое представление, которое содержит UITableView и UISearchBar и его контроллер.Это представление не представляет все пространство экрана, зарезервированное для DetailViewController.На самом деле, он использует только половину этого.На другой половине UIImageView.

И вот тут возникает проблема: каждый раз, когда я использую панель поиска, displaycontroller (я предполагаю) затемняет все, что присутствует внутри DetailViewController, включая представление изображения.Это не соответствует тому, что кто-то ожидает при запуске приложения.Есть ли способ установить рамку для затемнения?Или хотя бы отключить затемнение навсегда?

Заранее спасибо.

Ответы [ 4 ]

11 голосов
/ 09 ноября 2010

Вы правы, что именно UISearchDisplayController управляет эффектом "затемнения", который вы видите.

Что делает UISearchDisplayController, так это добавление UIControl в качестве подпредставления к представлению searchContentsController (свойство UISearchDisplayController), которое, скорее всего, является вашим контроллером детального просмотра. Этот UIControl - просто альфа-представление с серым фоном. Кажется, у него есть обработчик событий, который завершает поиск при нажатии.

Чтобы ограничить эффект затемнения вашим вспомогательным видом подробного вида, вам нужно сделать три вещи. (Я предполагаю, что ваш детализированный контроллер определен через XIB. Если нет, эти шаги можно выполнить и в коде.)

1) добавьте новый UIViewController в ваш xib детального представления-контроллера. Подключите этот новый контроллер вида к IBOutlet вашего контроллера детального вида. В моем примере я называю это «_searchAreaViewController». Это важно, даже если вы никогда не получите доступ к контроллеру представления (но помните, что вам придется выпустить его в какой-то момент)

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

    UIPopoverController *popoverController;
    UIToolbar *toolbar;

    id detailItem;
    UILabel *detailDescriptionLabel;

    IBOutlet UIViewController* _searchAreaViewController;
}

2) сделайте содержащий представление для вашей области поиска видом этого нового контроллера представления. Чтобы сделать это, используйте Interface Builder, чтобы установить новый выход для ссылки для этого представления, перетащив выход в searchAreaViewController и выбрав выход «view». Вы должны иметь содержащее представление - это должно быть подпредставлением вашего подробного представления, и оно должно содержать UISearchBar и, вероятно, ваш UITableView.

3) заставить свойство searchContentsController объекта UISearchDisplayController ссылаться на этот новый контроллер представления вместо контроллера подробного представления. Это можно сделать только через Interface Builder, так как свойство доступно только для чтения (у IB есть какое-то волшебство, чтобы сделать эту работу?) Если вам нужно выполнить этот шаг с помощью кода, вам придется создать подкласс UISearchDisplayController и вернуть правильное значение из переопределение свойства "searchContentsController".

Я сделал пример приложения, чтобы продемонстрировать это, и единственная строка кода, которую мне пришлось добавить в шаблон SplitView, была та, которая была указана в шаге 1 выше. Все остальное - просто добавление представлений / контроллеров и их правильное соединение в IB.

удачи!

1 голос
/ 19 октября 2015

iOS 8 +

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

iOS 7

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

Я знаю, что UISearchDisplayController на данный момент устарел, но если вам все еще нужно его использовать, вы можете решить вашу проблемус одной строкой кода отлично.Добавьте его в метод viewDidLoad.

0 голосов
/ 08 марта 2015

Я знаю, что опоздал, и это ужасная идея, но '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];
                           }


                       }
                   }
               }
           }
       }
   }
}
0 голосов
/ 09 ноября 2010

Не могли бы вы уточнить, что вы подразумеваете под "использовать панель поиска" и "затемняет все присутствующее"?Я интерпретирую то, что вы написали, таким образом, что клавиатура всплывает, когда вы собираетесь вводить текст в текстовое поле панели поиска.И что на этом этапе подробный вид затемняется, предотвращая взаимодействие с пользователем.

Причина заключается в том, что панель поиска реализует модальное диалоговое окно, которое предотвращает взаимодействие пользователя с представлением, пока отображается клавиатура.К сожалению, похоже, что нет способа настроить панель поиска для предотвращения такого поведения.С другой стороны, я не уверен, что пользователь не будет ожидать такого поведения, так как строки поиска постоянно модальны и в целом ведут себя под iOS.

Я пробовал два обходных пути:

1.) Существует свойство UIViewController, называемое modalPresentationStyle, которое в точности соответствует описанному вами поведению, если оно имеет значение UIModalPresentationFormSheet («Все открытые области недоступны, чтобы пользователь не мог взаимодействовать с ними».см. документация Apple ).Но установка для этого свойства других значений не меняет результат (по крайней мере, для меня это не сработало).

2.) Вам потребуется написать собственную немодальную замену панели поиска, поскольку стандартUITextField является немодальным и, следовательно, не затемняет другие элементы пользовательского интерфейса.Этот подход работает, но вам может потребоваться немного больше работы, чтобы он выглядел как «обычная» панель поиска.Но, опять же, поскольку эта панель поиска ведет себя не так, как обычные модальные панели поиска в iOS, это может не соответствовать ожиданиям пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...