UISearchBar перекрывает строку состояния в iOS
Я (как и все остальные здесь) нахожусь в той же проблеме перекрытия строки состояния, что и все остальные, с небольшим завихрением, и именно поэтому я открываю новый вопрос об этом.
Кажется, есть какой-то механизм, который позволяет UISearchBar знать, где его положение, которое полностью из-за удара.
jaredsinclair ответ здесь (строка состояния iOS 7 в стиле iPhone iOS 6 по умолчанию в приложении iPhone), подробно объясняет, как Apple Engineers позволяют нам вводить логику к нашему приложению, чтобы в максимально возможной степени сочетаться с пользовательской средой.
Я прошел процесс тщательного изучения каждого UIViewController в своем приложении и сделал возможной малейшую модификацию.
В большинстве случаев я смог решить проблему, используя код, который я нашел через несколько ответов SO
// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Однако это не сработает независимо от того, что я делаю в определенном представлении, где скрывается UINavigationBar.
![UISearchBar on top of status bar]()
На основе решения, найденного через SO, я смог решить эту проблему, добавив следующий фрагмент логики к этому конкретному UIViewController
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height;
}
Это подталкивает UIViewController n пикселей вниз "в зависимости" от высоты строки состояния.
Эффект этого показан здесь
![Hacked position UISearchBar]()
Проблема заключается в том, что когда я вхожу в поле поиска, UISearchBar добавляет по себе 20px дополнение в верхней части, что компенсирует весь пользовательский интерфейс.
![enter image description here]()
Это приводит меня к выводу, что UISearchBar пытается настроить себя, и по совпадению он настраивается на ту же сумму, что и высота строки состояния.
Если я не взламываю позицию, как только я войду в поле поиска, тогда эта автоматическая настройка выравнивает UISearchBar аккуратно под строкой состояния.
Надеюсь, я подробно рассказал о своей путанице, мне интересно, есть ли у кого-нибудь идеи для решения.
Ответы
Ответ 1
Если видимость NavigationBar видна в ViewDidLoad, выполните следующие действия:
self.edgesForExtendedLayout = UIRectEdgeNone;
Если навигационная панель скрыта, выполните следующие действия в ViewDidLoad:
Отрегулируйте все элементы UIView, сдвинув их на 20pt
Ответ 2
Борясь с этой проблемой тоже. Вам нужно поместить это в свой метод ViewDontLoad ViewControllers.
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
Это должно исправить это. Это указано в Руководстве по переходу iOS 7.
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1
Ответ 3
UISearchBar имеет метод делегирования для того, что вы хотите. Просто поставьте 20px сверху.
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
К сожалению, он не работает вместе с UISearchDisplayController.
Ответ 4
У меня возникла такая же проблема и на основе таких предложений, как @Ben и здесь. В итоге я добавил следующий код, который помог мне:
- (void) viewDidLayoutSubviews
{
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
в качестве альтернативы этот код также работает
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.automaticallyAdjustsScrollViewInsets=YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.navigationController.view.backgroundColor = [UIColor whiteColor];
self.navigationController.navigationBar.translucent = YES;
}
Ответ 5
Если кто-то хочет решить эту проблему с помощью AutoLayout, вместо добавления ограничения searchBar.top = self.view.top
добавьте ограничение в topLayoutGuide, например:
searchBar.top = topLayoutGuide.bottom
Ответ 6
Я не совсем понимаю, что панель поиска настраивает собственную высоту - мои строки поиска не делают этого? Но.
Вы можете добавить ограничение в руководство Top Layout Guide в IB для панели поиска. Это приведет к тому, что он будет придерживаться нижней части строки состояния как в ios 6, так и в ios 7. Если вы затем удалите код, в котором вы вручную отрегулируете высоту строки состояния. Это должно позаботиться об этом. Вы можете увидеть пример того, как это сделать: https://developer.apple.com/library/ios/qa/qa1797/_index.html