Высота UISearchBar на iOS8 при отображенииScopeBar = YES
Я использую UISearchBar
в своем приложении, showsScopeBar=YES
. При работе под iOS8 (как в симуляторе, так и на устройстве) панель видимости скрыта, а высота строки поиска остается на уровне 44 вместо ожидаемого значения 88. Используя новый отладчик вида в Xcode 6, я вижу, что панель видимости на самом деле присутствует, но остается скрытым за текстовым полем.
Единственный способ, который я нашел до сих пор, - это вручную установить высоту строки поиска на 88, что, конечно же, является ужасным взломом.
Я пропустил какую-либо документально подтвержденную несовместимость, или это ошибка?
Ответы
Ответ 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