0

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

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

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

    view.addSubview(viewController.view) 
} 

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

Expected result

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

Actual result

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

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

Кто-нибудь знает об этом?

+0

Кажется, что есть лучшее решение http://stackoverflow.com/questions/38426146/how-to-keep-navigation-bar-from-disappearing-with-msmessagesviewcontroller-ui. – nouatzi

ответ

1

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

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

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

LayoutView layout

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

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

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

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

+0

Не могли бы вы помочь, если бы я создал второй представляющий viewcontroller в кодировании не через раскадровку? – guhan0

+0

@ guhan0 вы должны иметь возможность воссоздать 'layoutView' с теми же ограничениями через код, как и в Storyboard. Я не пробовал этого, но не должно быть разницы. – Aleksander