ios 9 Постоянное размещение UIPopoverPresentationController при вращении

в iOS9, когда я поворачиваю экран с помощью UIPopoverPresentationController, координаты сбрасываются до 0 и не привязываются к моему sourceView, который является кнопкой.

Я пытался:

func popoverPresentationController (popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverToRect rect: UnsafeMutablePointer, представление inView: AutoreleasingUnsafeMutablePointer) { rect.initialize (CGRectMake (200, 200, 400, 400))}

но безрезультатно. Любая помощь ?


person applejuiceteaching    schedule 09.09.2016    source источник
comment
rect.initialize(CGRectMake(200, 200, 400, 400) Правда? Если это ваш код, неудивительно, что ничего не происходит.   -  person matt    schedule 16.10.2016


Ответы (1)


Вы можете применить ограничения к кнопке sourceView, а затем просто использовать ее в качестве источника всплывающего окна:

myPopoverViewController.popoverPresentationController?.sourceView = button

Вы также можете установить sourceView в раскадровке, но sourceRect необходимо установить в коде:

myPopoverViewController.popoverPresentationController?.sourceRect = button.bounds

Вам нужен правильный исходный прямоугольник, чтобы стрелка всплывающего окна правильно выровнялась. Теперь вам не нужно закрывать и показывать всплывающее окно при ротации. UIPopoverPresentationController сделает это за вас. Вам даже не нужно обновлять sourceView/sourceRect после того, как они настроены на создание всплывающего окна.

Используйте viewWillTransition, чтобы поймать изменения размера и ориентации:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: { _ in
        if self.popover != nil {
            // optionally scroll to popover source rect, if inside scroll view
            let rect = ...
            self.scrollView.scrollRectToVisible(rect, animated: false)

            // update source rect constraints
            buttonConstraint.constant = ...
            button.setNeedsLayout()
            button.layoutIfNeeded()
        }
    }, completion: nil)
}

Объяснение. Трюк с animate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil) заключается в том, что вы должны обновлять свои ограничения в замыкании alongsideTransition, а не в completion. Таким образом вы гарантируете, что UIPopoverPresentationController имеет обновленный sourceRect при восстановлении всплывающего окна в конце вращения.

Что может показаться нелогичным, так это то, что внутри alongsideTransition замыкания у вас уже есть новый макет, из которого вы получаете расчет ограничений.

person Dmitry    schedule 15.10.2016