it-swarm.com.ru

Навигационная панель появляется над представлениями с новым iOS7 SDK

CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

В более ранних версиях он работает правильно. Панель поиска отображается под statusbar и панелью навигации. tableview появляется под строкой поиска

Но когда я запускаю это на Xcode 5 sdk iOS 7, строка поиска не видна (я думаю, что она расположена под строкой состояния и панелью навигации), а также панель навигации появляется над представлением таблицы.

Будет ли это исправлено в стабильном выпуске iOS 7?

Или это проблема моего кодирования?

Или мы должны обработать это, добавив значение y (y = statubar height + nav bar height) для iOS 7?

Я недавно загрузил Xcode 5 DP для тестирования своих приложений в iOS 7. Первое, что я заметил и подтвердил, это то, что границы моего представления не всегда изменяются с учетом строки состояния и панели навигации.

В viewDidLayoutSubviews я печатаю границы представления:

{{0, 0}, {320, 568}}

В результате мой контент появляется под панелью навигации и строкой состояния.

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

Кто-нибудь еще сталкивался с этой проблемой?

Обновление:

Я нашел решение для этой конкретной проблемы. Установите для полупрозрачного свойства панели навигации значение NO:

self.navigationController.navigationBar.translucent = NO;

Это предотвратит отображение вида под панелью навигации и строкой состояния.

Однако я не нашел исправления для случая, когда вы хотите, чтобы панель навигации была полупрозрачной. Например, при просмотре фотографии в полноэкранном режиме, я хочу, чтобы панель навигации была полупрозрачной, а вид под ней был обрамлен. Это работает, но когда я переключаю показ/скрытие панели навигации, я получаю еще более странные результаты. Первое подпредставление (a UIScrollView) получает свои границы y Origin меняется каждый раз.

111
user2110287

Это не совсем верно. В iOS 7 появилось новое свойство, позволяющее настроить поведение макета, как в предыдущих версиях iOS. Поместите этот кусок кода в свой контроллер представления, и вы должны быть готовы! Место, занимаемое вашей навигационной панелью, должно учитываться автоматически 

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

Вы должны добавить вышеупомянутое в вашем методе -(void)viewDidLoad.

Примечание. Вы должны использовать последнюю версию GM iOS 7 и Xcode 5, поскольку API изменился по сравнению с бета-версиями.

188
One Man Crew

Screenshot from storyboard

Если вы работаете в раскадровке (что я настоятельно рекомендую!), Это решение: Вы можете отключить «Расширить края» вашего ViewController в раскадровке. Вы должны сделать это для каждого viewController. Вы можете отключить расширенные ребра, щелкнув значок viewController на сториборде (кроме productOwner под самим представлением), а затем выбрав инспектор атрибутов (как показано на изображениях).

Это также установит выравнивание линий как iOS 6.

Еще один замечательный инструмент в xCode 5 - «Просмотр»: нажмите кнопку дворецкого (помощник редактора) и выберите «Просмотр». там вы можете выбрать iOS 6 и посмотреть, как будет выглядеть ваш дизайн раскадровки на iOS 6. 

Это просто здорово: D

[Обновление]

Будьте осторожны: отключение «Расширить края» может привести к черному свечению на панели навигации, когда приложение переходит в фоновый режим на iOS7. свечение также будет видно в многозадачном режиме (двойное нажатие на кнопку домой). это можно решить, установив белый цвет фона панели навигации.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
37
MQoder

Как говорит ОП, существует простое решение, состоящее в том, чтобы сделать панель навигации непрозрачной. Вместо того, чтобы делать это в коде, просто снимите флажок «Полупрозрачный» для корневой панели навигации:

enter image description here

12
Bids

self.edgesForExtendedLayout=UIRectEdgeNone;

Работает на симуляторе iOS 7 (Xcode 5 DP5)

8
yhlin

все эти ответы были полезны, особенно ответы MQoder, но для меня мне также пришлось установить верхнюю панель по умолчанию на «непрозрачную черную навигацию». 

enter image description here

2
jasonpurdy

Ответ @One Man Crew правильный, но:

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

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
1
Yossi

Если вы хотите сохранить прозрачность, когда пользователь прокручивает ваше табличное представление, вы можете установить для него contentInset:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
0
Enrico Susatyo

self.edgesForExtendedLayout = UIRectEdgeNone;

И вам нужно сделать это в приложении AppDelegate #: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

В противном случае цвет фона панели навигации изменится на серый. Потому что прозрачная панель навигации перекрывает окно.

0
EIMEI