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
источник
  • Любая удача по этой проблеме? У меня такая же проблема. Я заметил, что на ваших скриншотах вы используете какой-то слайд-выход Nav. Контроллер. Я тоже, может быть, это часть проблемы? –  Chilly 28.11.2013 в 04:16
  • Здравствуйте, @Chilly нет решения, к сожалению, но на следующей неделе мы начинаем новую итерацию пользовательского интерфейса, и я буду больше смотреть на эту проблему, на данный момент мы выпустили с этой неприятностью, я буду держать вас в позе –  Fotis Paraskevopoulos 05.12.2013 в 11:25

6 ответов

27

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

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

    
ответ дан Sunil Adhyaru 04.10.2013 в 11:33
источник
  • Пятно на. Если вы используете построитель интерфейса, вы можете использовать дельта iOS6 / 7: во-первых, «просматривать как iOS 6.0», а затем установить дельта «20», чтобы достичь смещения +20 в iOS 7 (необходимо установить на всех представлениях, которые нуждаются в ударах вниз). –  William Denniss 09.10.2013 в 12:12
  • Моя панель поиска скрыта, и я помещаю переключатель в панель навигации. В iOS 6 он работал нормально, и теперь он работает нормально в iOS с настройкой self.edgesforExtendedLayout. Благодаря! –  Ismael 18.12.2013 в 15:02
  • Пожалуйста, помогите мне, как сменить все элементы UIView –  Anees 20.12.2016 в 13:59
4

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

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

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

ответ дан Ben Lime 24.09.2013 в 14:39
источник
  • Спасибо, Бен, если вы прочтете мой вопрос, я уже пробовал это. И даже если он сработает, он не решает автоматическую настройку UISearchBar на 20 пикселей –  Fotis Paraskevopoulos 24.09.2013 в 16:32
  • Извините, что я не мог вам помочь. Во всяком случае, в моем приложении это сработало, и когда я устанавливаю edgeForExtendedLayout, кадр поля поиска остается таким, какой он был, когда он неактивен. Нет смещения 20px. –  Ben Lime 25.09.2013 в 09:05
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
источник
  • Где вы положили этот код точно? –  Fotis Paraskevopoulos 23.01.2014 в 19:13
  • Я поместил его в класс реализации моего зрителя, я надеюсь, что это полезно. –  malkoty 24.01.2014 в 08:43
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
источник