UISearchBar перекрывает строку состояния в iOS

17

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

Кажется, есть какой-то механизм, который позволяет UISearchBar знать, где его положение, которое полностью из-за удара.

jaredsinclair ответ здесь ( строка состояния iOS 7 Вернуться к iOS 6 стиль по умолчанию в приложении iPhone? ), подробно объясняет, как Apple Engineers позволяют нам вводить логику в наше приложение, чтобы максимально гармонировать с окружающей средой пользователя.

Я прошел процесс тщательного изучения каждого UIViewController в своем приложении и сделал возможной малейшую модификацию.

В большинстве случаев я смог решить проблему, используя код, который я нашел через несколько ответов SO

// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

Однако это не сработает независимо от того, что я делаю в определенном представлении, где скрывается UINavigationBar.

На основе решения, найденного через 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 вниз «в зависимости» от высоты строки состояния.

Эффект этого показан здесь

Проблема заключается в том, что когда я вхожу в поле поиска, UISearchBar добавляет по себе 20px дополнение в верхней части, что компенсирует весь пользовательский интерфейс.

Это приводит меня к выводу, что UISearchBar пытается настроить себя, и по совпадению он настраивается на ту же сумму, что и высота строки состояния.

Если я не взламываю позицию, как только я войду в поле поиска, тогда эта автоматическая настройка выравнивает UISearchBar аккуратно под строкой состояния.

Надеюсь, я подробно рассказал о своей путанице, мне интересно, есть ли у кого-нибудь идеи для решения.

    
задан Fotis Paraskevopoulos 24.09.2013 в 09:54
источник

6 ответов

27

Если видимость NavigationBar видна в ViewDidLoad, выполните следующие действия:

self.edgesForExtendedLayout = UIRectEdgeNone;

Если навигационная панель скрыта, выполните следующие действия в ViewDidLoad:

Отрегулируйте все элементы UIView, сдвинув их 20pt

    
ответ дан Sunil Adhyaru 04.10.2013 в 11:33
источник
4

Борясь с этой проблемой тоже. Вам нужно поместить это в свой метод ViewDontLoad ViewControllers.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

Это должно исправить это. Это указано в iOS 7 Transition Guide. Ссылка     

ответ дан Ben Lime 24.09.2013 в 14:39
источник
4

UISearchBar имеет метод делегирования для того, что вы хотите. Просто поставьте 20px сверху.

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}

К сожалению, он не работает вместе с UISearchDisplayController.

    
ответ дан DanielFo 27.09.2013 в 12:39
источник
2

У меня возникла такая же проблема и на основе таких предложений, как @ 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;
    }
    
ответ дан malkoty 23.01.2014 в 14:07
источник
2

Если кто-то хочет решить эту проблему с помощью AutoLayout, вместо добавления ограничения searchBar.top = self.view.top добавьте ограничение на topLayoutGuide, например:

searchBar.top = topLayoutGuide.bottom
    
ответ дан rounak 25.05.2015 в 09:41
источник
0

Я не совсем понимаю, что панель поиска настраивает собственную высоту - мои строки поиска не делают этого? Но.

Вы можете добавить ограничение в руководство Top Layout Guide в IB для панели поиска. Это приведет к тому, что он будет придерживаться нижней части строки состояния как в ios 6, так и в ios 7. Если вы затем удалите код, в котором вы вручную отрегулируете высоту строки состояния. Это должно позаботиться об этом. Вы можете увидеть пример того, как это сделать: Ссылка

    
ответ дан BreadicalMD 25.09.2013 в 16:56
источник