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