UIPresentationController изменяет размер, когда поверх него отображается другой контроллер представления

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

override func frameOfPresentedViewInContainerView() -> CGRect {
    let myDX = (self.containerView!.bounds.width - 600)/2
    let myDY = (self.containerView!.bounds.height - 600)/2
    return self.containerView!.bounds.insetBy(dx: myDX, dy: myDY)
}

Все отлично работает до этого момента.

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

Проблема в том, что когда я отключаю контроллер вида сверху, который покрывает весь экран, мой настраиваемый контроллер представления также покрывает весь экран. Я хочу, чтобы размер моего пользовательского контроллера представления оставался прежним (меньше, чем containerView). Есть ли способ, которым я могу достичь этого.

Любая помощь будет оценена


person Vik Singh    schedule 25.09.2015    source источник
comment
Может быть, вы можете использовать autoLayout вместо жесткого кода размеров кадра?   -  person koen    schedule 09.10.2015
comment
В iOS 12 я смог решить эту проблему, изменив presentationStyle на overCurrentContext вместо currentContext.   -  person Maximilian Litteral    schedule 11.08.2019


Ответы (1)


Я столкнулся с той же проблемой. Я не мог решить это, добавляя ограничения, и -[UIPresentationController containerViewWillLayoutSubviews] вызывается слишком поздно (после завершения анимации отклонения).

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

В iOS 8 вы можете использовать UIModalPresentationOverFullScreen вместо presentationStyle при представлении с меньшего контроллера. В этом случае система не будет автоматически удалять представление текущего контроллера. (-[UIViewController viewWillDisappear:] и тому подобное не вызывается на контроллере представления, когда вы это делаете)

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

person riadhluke    schedule 28.10.2015