Я использую UIPopoverPresentationViewController
для представления UIViewController
модально в поповере.Согласно документации Apple , обновление свойства preferredContentSize
на UIViewController
во время его представления во всплывающем окне приведет к изменению размера.
Пока работает изменение размера, определенные значенияpreferredContentSize
вызовет этот странный артефакт белого прямоугольника во время анимации.Помимо появления этого странного белого прямоугольника, анимация работает отлично.
![White Rectangle Artifact](https://i.stack.imgur.com/SUywy.png)
Это код, который я использую для представления моего всплывающего окна.В этом случае 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:)
, также приводит к появлению артефакта белого прямоугольника.