当showsScopeBar = YES时,iOS8上的UISearchBar高度

时间:2014-09-08 13:15:54

标签: ios uisearchbar ios8

我在我的应用中使用UISearchBar showsScopeBar=YES。当在iOS8下运行时(在模拟器和设备上),范围栏被隐藏,搜索栏的高度保持在44而不是预期的88.在Xcode 6中使用新的视图调试器我可以看到范围栏实际上是现在,但仍然隐藏在文本字段后面。

到目前为止,我找到的唯一方法是手动将搜索栏的高度设置为88,这当然是一个糟糕的黑客。

我是否遗漏了一些记录在案的不兼容性,或者这是一个错误?

4 个答案:

答案 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