我在我的应用中使用UISearchBar
showsScopeBar=YES
。当在iOS8下运行时(在模拟器和设备上),范围栏被隐藏,搜索栏的高度保持在44而不是预期的88.在Xcode 6中使用新的视图调试器我可以看到范围栏实际上是现在,但仍然隐藏在文本字段后面。
到目前为止,我找到的唯一方法是手动将搜索栏的高度设置为88,这当然是一个糟糕的黑客。
我是否遗漏了一些记录在案的不兼容性,或者这是一个错误?
答案 0 :(得分:23)
我也遇到了这个问题。在Apples开发者论坛上搜索后,我找到了这个帖子: https://devforums.apple.com/thread/235803?start=0&tstart=0
显然,SearchBar也不会自动执行sizeToFit。所以它的高度保持在44而不是调整到范围按钮。 这个bug在iOS8 GM中没有修复。
我在viewWillAppear中做了一个简单的[self.searchBar sizeToFit]:这解决了它。
答案 1 :(得分:8)
此问题也发生在iOS 8发行版中。 我在viewWillAppear中添加了这两行:并解决了它。
- (void)adjustSearchBarToShowScopeBar{
[self.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchBar;
}
只是添加[self.searchBar sizeToFit]掩盖了我的tableview的第一行。
只需刷新tableview标题即可完美解决问题。
答案 2 :(得分:4)
这似乎不是iOS 8的错误,而是Xcode 6 GM编译的Storyboard错误,因为它也发生在iOS 6/7上。
根据建议,通过在sizeToFit
的搜索栏上调用viewWillAppear
来解决问题。
如果您想从视图而不是控制器进行操作,可以尝试将其放在willMoveToWindow
内。
这个错误似乎影响了iOS 8上的Xcode 5.x构建和所有系统上构建的Xcode 6 GM。
答案 3 :(得分:0)
使用Janne's answer,我认为通过方法调配分享如何自动执行此操作会很有帮助。
@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