SafeArea в iOS 11: как добавить вид на главный экран с настраиваемой панелью навигации без safeArea из кода в target-c

В моем проекте на Objective-C mainScreen с Custom NavigationBar (созданный из кода):

mainNavigationController = [[NavigationController alloc] initWithRootViewController:mainMenuViewController];
mainNavigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
mainNavigationController.delegate = self;
mainNavigationController.navigationBar.tintColor = [UIColor whiteColor];

UIWindow* window = self.window;
window.backgroundColor = [UIColor whiteColor];
window.rootViewController = mainNavigationController;
[window makeKeyAndVisible];

Я меняю self.view как размер [UIScreen mainScreen].applicationFrame]:

UIView* mainView = [[[MainViewControllerView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
self.view = mainView;

В mainScreenView я добавляю scrollView:

scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
scrollView.autoresizesSubviews = YES;
scrollView.autoresizingMask = UIViewAutoresizingNone;
scrollView.backgroundColor = [UIColor clearColor];
scrollView.bounces = NO;

И добавьте немного subView внутри scrollView:

[scrollView addSubview:myLogoView];
[scrollView addSubview:littleScrollView];
[scrollView addSubview:firstButton];
[scrollView addSubview:secondButton];
[scrollView addSubview:thirdButton];
[scrollView addSubview:fouthButton];
[scrollView addSubview:fifthButton];
[scrollView addSubview:sixthButton];
[scrollView addSubview:seventhButton];
[scrollView addSubview:activityIndicatorView];

https://www.dropbox.com/s/ttrkolgnch80kr9/safeArea.png?dl=0

Если использовать XCODE 8 и iOS ‹= 10, все представления правильно размещаются на главном экране (место myLogoView игнорирует размер пользовательской панели навигации и имеет координату Y == 20,0 в абсолютных координатах экрана устройства), но при использовании XCode 9 и iOS 11 myLogoView имеют поместите под мою пользовательскую панель навигации (высота == 44) myLogoView Y == 64.0 в абсолютных координатах экрана устройства, в iOS 10 (под xCode9) все работает хорошо - добавлен вид на mainScreen, размещенный в начальных координатах экрана, и игнорировать высоту пользовательского NavigationBar.

В swift и раскадровке я знаю, как это было исправлено в iOS11, чтобы легко удалить верхнюю строку safeArea, но как удалить safeArea из кода в Objective-C.

Как исправить эту беду?


person Ivan Kushiju    schedule 25.09.2017    source источник


Ответы (1)


Безопасная область в iOS 11 заменяет верхний и нижний макет, и Apple предоставляет более подробную информацию об этом, как показано ниже:

Направляющая компоновки, представляющая часть вашего представления, не закрытую полосами и другим содержимым. В iOS 11 Apple отказывается от верхних и нижних направляющих макета и заменяет их единым руководством по макету безопасной области.

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

введите здесь описание изображения

Вы можете снять отметку с безопасной области, и она вернется к верхнему и нижнему расположению.

Ref До и после снять галочку с безопасной зоны:

До или по умолчанию:

введите здесь описание изображения

Снимите флажок Безопасная зона или старое поведение:

введите здесь описание изображения

Надеюсь, это поможет понять новое обновление iOS 11, связанное с верхним и нижним макетом, и изменить код в соответствии с этим изменением макета.

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

person CodeChanger    schedule 25.09.2017
comment
Извините, но проблема, которую я упомянул, знает, как это сделать из StoryBoard и Swift. Интересует Objective-c - person Ivan Kushiju; 25.09.2017
comment
но если вы отключите безопасную область из раскадровки, это решит вашу проблему, потому что вы упомянули, что безопасная область создает проблему для вашей пользовательской панели навигации, поэтому я так не думаю, что после отключения этого не требуется ничего менять, так же как и в iOS 10. - person CodeChanger; 25.09.2017
comment
в моем проекте нет раскадровки, и я не могу отключить эту безопасную область из панели настроек... - person Ivan Kushiju; 25.09.2017
comment
Итак, вы можете разместить здесь свой собственный штрих-код навигации, чтобы я мог понять, что не так с этим макетом? Также, пожалуйста, поделитесь снимком экрана, как это выглядит в iOS 11 с безопасной зоной. - person CodeChanger; 25.09.2017
comment
‹img src=dropbox.com/s/ttrkolgnch80kr9/safeArea.png? дл=0 ширина=200 высота=100› - person Ivan Kushiju; 25.09.2017
comment
вы проверяете эту тему для настройки safeAreaLayout github.com/SnapKit/SnapKit/issues/448 - person CodeChanger; 25.09.2017
comment
Спасибо, но эти ссылки являются примерами, приведенными только для кода Swift, моего проекта в Objective-C.... :( - person Ivan Kushiju; 25.09.2017