Всплывающее окно Просмотр позиций в неправильном месте при повороте - PullRequest
0 голосов
/ 08 мая 2020

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

comparison between before and after

Снимок экрана слева - это правая позиция, которая появляется при первом запуске всплывающего окна, снимок экрана справа находится в неправильном положении, вы можете четко увидеть разницу по линии, которую я провел между ними.

Вот код, который я использую для центрирования всплывающего окна

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if let controller = self.presentedViewController as? PopoverController {
            controller.popoverPresentationController?.sourceRect = CGRect(x: size.width / 2,
                                                                          y: size.height / 2,
                                                                          width: 0, height: 0)
            let globalPoint = controller.view.superview?.convert(controller.view.frame.origin, to: nil)
            controller.label.text = "x: \(globalPoint!.x), y: \(globalPoint!.y)"
            self.view.layoutIfNeeded()
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "popoversegue" {
            let controller = segue.destination
            controller.popoverPresentationController!.delegate = self
            controller.popoverPresentationController!.sourceRect = CGRect(x: view.center.x, y: view.center.y,
                                                                          width: 0, height: 0)
            controller.popoverPresentationController?.sourceView = self.view
            controller.preferredContentSize = CGSize(width: 500, height: 600)
            controller.popoverPresentationController!.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }
    }

Более того, я понял, что проблема возникает только в портретном направлении, всплывающее окно всегда хорошо центрируется в альбомном положении. В чем может быть проблема?

1 Ответ

1 голос
/ 08 мая 2020

Приведите свой класс в соответствие с «UIPopoverPresentationControllerDelegate»

Затем добавьте следующий код. Я пробовал и работает нормально.

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>) {
        let viewFrame = popoverPresentationController.presentingViewController.view.frame
        let deltaX = viewFrame.height - rect.pointee.midX
        rect.pointee = CGRect(x: viewFrame.width - deltaX, y: rect.pointee.maxY, width: 0, height: 0)
    }
...