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