popover permittedArrowDirections = .left/.right 与 popover 框架混淆

popover permittedArrowDirections = .left/.right messes with popover framing

自从迁移到 Swift 5 后,将 permittedArrowDirections 设置为 .left/.right 的弹出窗口会稍微偏离它们应有的位置。但是,当将 permittedArrowDirections 设置为 .top/.bottom 时,问题就消失了。请看下图:

我将弹出窗口设置如下:

let popoverController = colorPickerVC.popoverPresentationController
popoverController!.permittedArrowDirections = .right
popoverController!.sourceRect = CGRect(x: Constants.uiPopoverArrowHorizontallOffset2, y: self.buttonLayersPicker.frame.height/2 ,width: 0,height: 0) // anchor popover to middle-left of calling button
popoverController?.backgroundColor = Constants.uiColorPopupBgDark1 // set the color of the popover arrow
    popoverController?.passthroughViews = [viewControllerMain.view] // allow interaction with bg view while popover is being displayed
// present popover
viewControllerMain.present(colorPickerVC, animated: true, completion: nil)

有没有人遇到过这个问题?如何解决?

提前致谢

这不是特定于 Swift 5. 这是 iOS 13 中的更改。弹出箭头占据的区域现在是视图框架的一部分。解决方案是确保您的布局基于视图的安全区域。换句话说,针对视图控制器的视图 safeAreaLayoutGuide.

设置子视图的约束

通过使用安全区域,无论弹出箭头位于何处,您的布局都将是正确的,即使您支持 iOS 除了 13 之外的 11 或 12,它也能正常工作。