簡體   English   中英

iOS:在iOS13中顯示popover邊框的問題

[英]iOS: Problem of display the popover border in the iOS13

我顯示的彈出窗口現在顯示錯誤。 箭頭一側缺少一條線。 我們可以檢查箭頭末端是否有一小塊黑色。 我覺得里面有一個視圖太長了。

顯示彈出框的代碼:

   _popoverController = UIPopoverController(contentViewController: navController)
   _popoverController?.delegate = self

   let rect = slotCollectionView.cellForItem(at: indexPath)!.frame
   self._popoverController?.backgroundColor = UIColor.init(rgb: Int(quaternaryColorHexa))
   self._popoverController?.present (from: rect, in: self.slotCollectionView, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true) 

初始化 Popover 的代碼:

override func viewDidLoad()
{
    super.viewDidLoad()

    self.preferredContentSize = contentSize()
    self.navigationController!.preferredContentSize = self.preferredContentSize;

    peopleTableView.isScrollEnabled = true
    peopleTableView.bounces = true
    peopleTableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    peopleTableView.tableFooterView?.isHidden = true
    peopleTableView.backgroundColor = UIColor.init(rgb: Int(quinquenaryColorHexa))

    self.view.backgroundColor = UIColor.init(rgb: Int(quinquenaryColorHexa))
    self.view.layer.cornerRadius = 13.0
    self.view.layer.borderWidth = 1.5
    self.view.layer.borderColor = UIColor.init(rgb: Int(quaternaryColorHexa)).cgColor 

iOS12顯示:
iOS12
iOS13顯示:
iOS13

正如這個答案中提到的,是 iOS 13 的一項新功能,即 UIPopovers 在其內容視圖中包含箭頭。 您應該使用安全區域對這種變化做出正確的反應。

您不能使用安全區域對這種變化做出反應。 我的感覺是這是 iOS 13 中的一個錯誤,我將解釋原因......

當您遇到使用 UIPopoverArrowDirectionAny 的情況時,您會發現問題僅在箭頭位於彈出窗口的頂部或左側時存在,而在箭頭出現在彈出窗口的右側或底部時不存在。 如果您在代碼中進行調整以進行補償,則在使用 UIPopoverArrowDirectionUp 或 UIPopoverArrowDirectionLeft 時它會起作用,但在使用 UIPopoverArrowDirectionAny 時使用該調整將無法正確顯示,並且彈出窗口出現在目標矩形的上方或右側。

我認為這是iOS13版本中的iOS錯誤,我建議您使用該git項目來做自己的popover:
DDPopoverBackgroundView

並使用它來顯示彈出窗口:

       // Popover
       _popoverController = UIPopoverController(contentViewController: navController)
       _popoverController?.delegate = self

       let rect = slotCollectionView.cellForItem(at: indexPath)!.frame

       self._popoverController!.contentSize = CGSize(width: 350, height: 600)

       self._popoverController!.backgroundViewClass = DDPopoverBackgroundView.self
       self._popoverController!.backgroundColor = UIColor.init(rgb: Int(quaternaryColorHexa)) //arrow color

       OperationQueue.main.addOperation({
           self._popoverController?.present(from: rect, in: self.slotCollectionView, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true)
       })

請享用 ! ;-)

我遇到過同樣的問題。 我的解決方案如下:

class MyPopoverViewController: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        let borderColor = UIColor.black
        let borderWidth = CGFloat(1.5)
        let cornerRadius = CGFloat(13)
        let extensionWidth = CGFloat(20)

        if #available(iOS 13, *), let superview = self.view.superview {
            let guide = self.view.safeAreaLayoutGuide
            let borderView = UIView()
            borderView.isUserInteractionEnabled = false
            borderView.backgroundColor = UIColor.clear
            borderView.layer.borderWidth = borderWidth + extensionWidth
            borderView.layer.cornerRadius = cornerRadius + extensionWidth
            borderView.layer.borderColor = borderColor.cgColor
            borderView.translatesAutoresizingMaskIntoConstraints = false
            superview.addSubview(borderView)
            NSLayoutConstraint.activate([
                borderView.leftAnchor.constraint(equalTo: guide.leftAnchor, constant: -extensionWidth),
                borderView.topAnchor.constraint(equalTo: guide.topAnchor, constant: -extensionWidth),
                borderView.bottomAnchor.constraint(equalTo: guide.bottomAnchor, constant: extensionWidth),
                borderView.rightAnchor.constraint(equalTo: guide.rightAnchor, constant: extensionWidth)
            ])
        } else {
            self.view.layer.borderWidth = borderWidth
            self.view.layer.cornerRadius = cornerRadius
            self.view.layer.borderColor = borderColor.cgColor
            self.view.clipsToBounds = true
            self.popoverPresentationController?.backgroundColor = borderColor
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM