我正在编写一个SplitView iPad应用程序。在DetailViewController内部,有一个包含UITableView
和UISearchBar
及其控制器的小视图。此视图不代表为DetailViewController保留的整个屏幕空间。实际上,它只使用了一半。另一半有一个UIImageView
。
这就是问题所在:每次我使用搜索栏时,displaycontroller(我假设)都会使DetailViewController中的所有内容变暗,包括图像视图。这与人们在运行应用程序时的期望不一致。有没有办法将框架设置为暗灰色?或者至少禁用调光效果好吗?
提前致谢。
答案 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];
}
}
}
}
}
}
}
}