popover AllowedArrowDirections = .left/.right путается с обрамлением всплывающего окна

После перехода на Swift 5 всплывающие окна, для которых AllowArrowDirections установлено в .left/.right, отображаются немного не по центру, а где должны быть. Тем не менее, если задать для AllowArrowDirections значение .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)

Кто-нибудь сталкивался с этой проблемой? Как решить?

заранее спасибо


person Plutovman    schedule 02.10.2019    source источник
comment
@мэдди. Я думаю, что ваш первый комментарий (который сейчас мне не виден) был полезен, и я не согласен с тем, что это дубликат другого вопроса, на который вы сейчас указываете. Этот вопрос НЕ имеет четкого и окончательного ответа, в отличие от вашего предыдущего комментария. Я вернулся, изменил свои ограничения и решил проблему. Вы бы передумали менять статус обратно? Эта проблема сведет людей с ума.   -  person Plutovman    schedule 02.10.2019


Ответы (1)


Это не относится к Swift 5. Это изменение в iOS 13. Область, занимаемая всплывающей стрелкой, теперь является частью рамки представления. Решение состоит в том, чтобы убедиться, что вы основываете свой макет на безопасной области представления. Другими словами, установите ограничения подпредставлений относительно представления контроллера представления safeAreaLayoutGuide.

Используя безопасную область, ваш макет будет правильным независимо от того, где находится стрелка всплывающего окна, и он будет работать, даже если вы поддерживаете iOS 11 или 12 в дополнение к 13.

person rmaddy    schedule 02.10.2019
comment
О, кажется, я вижу. Внутри всплывающего окна я полагаюсь на .preferredContentSize.width во многих своих вычислениях (включая размер градиента). Я посмотрю, как я настроил свои ограничения. - person Plutovman; 02.10.2019