Не могу сделать пользовательский переход в Xcode 10 / iOS 12 - PullRequest
0 голосов
/ 13 ноября 2018

Мне сложнее всего представить презентацию выдвижного ящика на экране iPhone.

РЕДАКТИРОВАТЬ: я обнаружил, что iOS не соответствует .custom modalTransitionStyle, который я установил в Segue. Если я установлю это явно в prepareForSegue:, то вызовет мой делегат, чтобы получить UIPresentationController.

У меня есть пользовательский Segue, который также является UIViewControllerTransitioningDelegate. В методе perform() я установил для конечного объекта transitioningDelegate значение:

self.destination.transitioningDelegate = self

и я либо звоню super.perform() (если это модальный подарок или присутствует в качестве попугера), либо self.source.present(self.destination, animated: true) (если это пользовательский переход, потому что вызов super.perform() вызывает исключение).

Методы perform() и animationController(…) вызываются, но никогда presentationController(forPresented…).

Изначально я пытался сделать Segue в раскадровке «Представлять модально» с указанным моим классом Segue, но при этом не удалялся контроллер представления представления. Я попробовал «Представить как Popover», и клянусь, он сработал один раз, потому что он не удалял контроллер представления представления, но затем при последующих попытках он все же делал.

Итак, я сделал это "Custom", и perform() все еще вызывается с предустановкой _UIFullscreenPresentationController на контроллере представления назначения, и мой метод presentationController(forPresented…) никогда не вызывается.

Другие решения, связанные с этой проблемой, всегда зависят от неверно написанной подписи метода. Это мое, дословно:

public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?

Последние четыре дня я пытался выяснить «правильные» пользовательские переходы, и это не помогает, чтобы вещи не выглядели так, как рекламируется. Чего мне не хватает?

1 Ответ

0 голосов
/ 14 ноября 2018

Вместо использования пользовательской презентации вы можете использовать Container View для своего ящика.Таким образом, вы можете использовать UIViewController для содержимого Drawer, избегая при этом проблемы с пользовательским переходом.

Это достигается за два шага: сначала перетащите контейнерное представление в контроллер основного представления и правильно расположите его.Раскадровка будет выглядеть следующим образом: (Вы можете видеть, что у вас есть два контроллера представления. Один для основного вида и один для выдвижного ящика)

enter image description here

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

@IBAction func toggleDrawer(_ sender: Any) {
    let newHeight: CGFloat
    if drawerHeightConstraint.constant > 0 {
        newHeight = 0
    } else {
        newHeight = 200
    }

    UIView.animate(withDuration: 1) {
        self.drawerHeightConstraint.constant = newHeight
        self.view.layoutIfNeeded()
    }
}

Здесь я просто изменяю ограничение высоты выдвижного ящика, чтобы сдвигать его внутрь и наружу.Конечно, вы могли бы сделать что-то более причудливое:)

Вы можете найти демонстрационный проект здесь .

...