Высота UISearchBar на iOS8, когда showsScopeBar=YES


Я использую UISearchBar в своем приложении с showsScopeBar=YES. При работе под iOS8 (как в симуляторе, так и на устройстве) панель области скрыта, а высота строки поиска остается на уровне 44 вместо ожидаемых 88. Используя новый отладчик представления в Xcode 6, я могу видеть, что панель области фактически присутствует, но остается скрытой за текстовым полем.

Единственный способ, который я нашел до сих пор, - это вручную установить высоту строки поиска в 88, что, конечно, является ужасным взломом.

Я что-то пропустил документально подтвержденная несовместимость, или это ошибка?

4 13

4 ответа:

Я тоже столкнулся с этой проблемой. После поиска на форуме разработчиков Apple я нашел эту тему: https://devforums.apple.com/thread/235803?start=0&tstart=0

И, по-видимому, панель поиска не делает автоматически sizeToFit, когда это тоже предполагается. Так что его высота остается на уровне 44, вместо того чтобы подстраиваться под кнопки прицела. Ошибка не исправлена в iOS8 GM.

Я сделал простую [самость.searchBar sizeToFit] в моем представлении willappear: и это решило проблему.

Эта проблема возникает и в версии iOS 8 release. Я добавил Эти 2 строки в свой viewWillAppear: и это решило проблему.

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } Просто добавляю [себя.вирусом sizeToFit] был, прикрывая первую строку моей TableView для это. Просто обновление заголовка tableview исправило проблему идеально.

Похоже,что это не ошибка iOS 8, а ошибка Xcode 6 GM compiled Storyboard, как это происходит и на iOS 6/7.

Как было предложено, это исправляется вызовом sizeToFit в строке поиска в viewWillAppear.

Если вы хотите сделать это из вида, а не из контроллера, вы можете попробовать поместить его внутрь willMoveToWindow.


Эта ошибка, по-видимому, влияет на Xcode 5.x строит на iOS 8 и Xcode 6 GM строит на всех системах.

Используя ответ Янне, я подумал, что было бы полезно поделиться тем, как сделать это автоматически с помощью метода swizzling.

@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