Артефакт белого прямоугольника, появляющийся, в то время как UIPopoverPresentationController анимирует рост после увеличения предпочитаемого значения ContentSize - PullRequest
1 голос
/ 30 апреля 2019

Я использую UIPopoverPresentationViewController для представления UIViewController модально в поповере.Согласно документации Apple , обновление свойства preferredContentSize на UIViewController во время его представления во всплывающем окне приведет к изменению размера.

Пока работает изменение размера, определенные значенияpreferredContentSize вызовет этот странный артефакт белого прямоугольника во время анимации.Помимо появления этого странного белого прямоугольника, анимация работает отлично.

White Rectangle Artifact

Это код, который я использую для представления моего всплывающего окна.В этом случае preferredContentSize, установленный на CGSize(width: 200, height: 100), вызывает появление артефакта.Если я использую CGSize(width: 200, height: 200), то все работает идеально, без артефактов.

@objc private func presentPopover() {
    let vc = UIViewController()

    vc.modalPresentationStyle = .popover
    vc.preferredContentSize = CGSize(width: 200, height: 50)

    guard let popVC = vc.presentationController as? UIPopoverPresentationController else {
        fatalError("View Controller must have a Popover Presentation Controller")
    }

    popVC.sourceView = self.view
    popVC.sourceRect = self.label.frame
    popVC.delegate = self
    popVC.permittedArrowDirections = .up

    self.present(vc, animated: true)

    // very short delay to allow popover growth to animate
    // without delay, layout happens so quickly that no animation is visible
    Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
        vc.preferredContentSize = CGSize(width: 200, height: self.popoverHeight)
    }
}

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    return .none
}

Кажется, существует некоторая связь между появляющимся артефактом и preferredContentSize, но я просто не могу понять, что это за связь.

Я пытался планировать Timer позже, чем на 0,1 секунды (например, 1 секунда, 5 секунд) в будущем, думая, что может быть какое-то состояние гонки макета, но это не решило проблему.Если нет Timer, всплывающее окно автоматически появляется в финале preferredContentSize без анимации.Я предполагаю, что это происходит, потому что макет происходит так быстро.Использование другой конструкции задержки, такой как DispatchQueue.main.asyncAfter(deadline:execute:), также приводит к появлению артефакта белого прямоугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...