Подтвердить что ты не робот

Высота UISearchBar на iOS8 при отображенииScopeBar = YES

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

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

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

4b9b3361

Ответ 1

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

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

Я сделал простой [self.searchBar sizeToFit] в моем представленииWillAppear: и это решило его.

Ответ 2

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

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

Ответ 3

Кажется, это не ошибка iOS 8, но Xcode 6 GM скомпилировал ошибку Storyboard, как это происходит на iOS 6/7.

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

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


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

Ответ 4

Используя Janne answer, я подумал, что было бы полезно поделиться, как это сделать автоматически с помощью 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