showScopeBar = YES时,iOS8上的UISearchBar高度

我在我的应用程序中使用UISearchBar ,使用showsScopeBar=YES 。 当在iOS8下运行(在模拟器和设备上)时,范围栏是隐藏的,search栏的高度保持在44,而不是预期的88.在Xcode 6中使用新的视图debugging器,我可以看到范围栏实际上目前,但仍然隐藏在文本领域的后面。

到目前为止我发现的唯一方法是手动设置search栏的高度为88,这当然是一个可怕的黑客。

我是否缺less一些logging的不兼容性,或者这是一个错误?

我也遇到了这个问题。 search苹果开发者论坛后,我发现这个线程: https : //devforums.apple.com/thread/235803?start=0&tstart=0

显然,SearchBar也不会自动做sizeToFit。 所以它的高度保持在44,而不是调整到范围button。 这个bug在iOS8 GM中没有修复。

我做了一个简单的[self.searchBar sizeToFit]在我的viewWillAppear:并解决了它。

此问题也发生在iOS 8发行版本中。 我在viewWillAppear中添加了这两行:解决了这个问题。

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } - (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; }只要添加[self.searchBar sizeToFit]覆盖了我的tableview的第一行。 只是刷新tableview头完全解决了这个问题。

这似乎不是一个iOS 8的错误,而是一个Xcode 6 GM编译的故事板错误,因为它也发生在iOS 6/7上。

build议通过在viewWillAppear的search栏上调用sizeToFit来修复它。

如果你想从视图而不是控制器,你可以尝试把它放在willMoveToWindow里面。


这个bug似乎影响到iOS 8上的Xcode 5.x版本,而Xcode 6 GM则在所有系统上构build。

使用Janne的答案 ,我认为分享如何自动使用方法调整来做到这一点是有帮助的。

 @implementation UISearchBar (iOS8) static dispatch_once_t dispatchOnceToken; + (void)load { if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) { dispatch_once(&dispatchOnceToken, ^{ Class class = [self class]; SEL originalViewWillAppearSelector = @selector(layoutSubviews); SEL swizzledViewWillAppearSelector = @selector(swizzled_layoutSubviews); Method originalViewWillAppearMethod = class_getInstanceMethod(class, originalViewWillAppearSelector); Method swizzledViewWillAppearMethod = class_getInstanceMethod(class, swizzledViewWillAppearSelector); if(class_addMethod(class, originalViewWillAppearSelector, method_getImplementation(swizzledViewWillAppearMethod), method_getTypeEncoding(swizzledViewWillAppearMethod))) { class_replaceMethod(class, swizzledViewWillAppearSelector, method_getImplementation(originalViewWillAppearMethod), method_getTypeEncoding(originalViewWillAppearMethod)); } else { method_exchangeImplementations(originalViewWillAppearMethod, swizzledViewWillAppearMethod); } }); } } - (void)swizzled_layoutSubviews { [self swizzled_layoutSubviews]; [self sizeToFit]; } @end