UINavigationController как подвид для MSMessagesAppViewController

Я создаю расширение iMessage, где для расширенного стиля презентации я хочу использовать UINavigationController. Я пытаюсь добавить навигационный контроллер в качестве подвида MSMessagesAppViewController, используя функцию ниже:

private func present(viewController: UIViewController) {
    viewController.view.frame = view.frame

    addChildViewController(viewController)
    viewController.didMove(toParentViewController: self)

    view.addSubview(viewController.view)
}

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

Ожидаемый результат

Однако кажется, что view.frame на самом деле простирается под верхней панелью iMessage. Таким образом, панель навигации моего навигационного контроллера скрыта под верхней панелью iMessage. Однако представление содержимого самого представления прокрутки позиционируется правильно без дополнительной настройки. Пожалуйста, посмотрите на следующую иллюстрацию для фактического результата:

Фактический результат

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

В идеале панель навигации будет отображаться чуть ниже верхней панели iMessage, как по умолчанию прокрутка.

Кто-нибудь знает решение этого?


person Aleksander    schedule 10.12.2016    source источник
comment
Кажется, есть лучшее решение stackoverflow.com/questions/38426146/.   -  person nouatzi    schedule 06.05.2017


Ответы (1)


После небольшого размышления я нашел одно довольно хакерское решение. Я все еще принимаю отзывы и другие ответы.

Вышеупомянутого можно добиться, создав предварительный layoutView, который ограничен направляющими макета с помощью AutoLayout. Затем, установив рамку UINavigationController в соответствии с рамкой макета, она фактически будет занимать только видимую область.

Вы можете настроить представление, подобное моему, используя Storyboard следующим образом:

Макет LayoutView

Затем в вашем контроллере представления контейнера (в моем случае createStickerViewController) просто назначьте фрейм вашего UINavigationController фрейму вашего макета, как только ограничения будут выполнены:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Update frame after constraints have been satisfied for layoutView
    pickAssetNavigationController.view.frame = layoutView.frame
}

В результате навигационный контроллер занимает только эту фактическую видимую область, и поэтому панель навигации размещается чуть ниже верхней панели iMessage, как и ожидалось (см. рисунок 1 в исходном вопросе).

person Aleksander    schedule 10.12.2016
comment
Не могли бы вы помочь, если бы я создал второй контроллер представления представления в кодировании, а не через раскадровку.!? - person guhan0; 19.06.2017
comment
@ guhan0 вы должны иметь возможность воссоздать layoutView с теми же ограничениями с помощью кода, как я делаю в раскадровке. Я не пробовал, но разницы быть не должно. - person Aleksander; 19.06.2017