Popover演示控制器-视图周围有间距,不适合全宽

问题描述 投票:0回答:2

我在将UITableViewController显示为弹出窗口时遇到问题。弹出窗口出现,但其宽度未在全屏显示-前端和后端都有某种余量。查看屏幕截图以获取更多信息:

enter image description here

这是我用来设置和显示控制器的代码:

let controller = UITableViewController()
      controller.preferredContentSize = CGSize(width: self.view.bounds.width, height: self.popOverPresentationControllerHeight)
      controller.modalPresentationStyle = .popover
      controller.tableView.separatorStyle = .none
      controller.tableView.allowsMultipleSelection = true
      controller.tableView.dataSource = self.filterOptionsDataSource
      controller.tableView.delegate = self
      controller.tableView.isScrollEnabled = false

      controller.tableView.register(FilterOptionCell.self, forCellReuseIdentifier: FilterOptionCell.identifier)
      controller.tableView.register(UINib(nibName: FilterOptionCell.identifier, bundle: nil), forCellReuseIdentifier: FilterOptionCell.identifier)
      controller.tableView.register(FilterConfirmCell.self, forCellReuseIdentifier: FilterConfirmCell.identifier)
      controller.tableView.register(UINib(nibName: FilterConfirmCell.identifier, bundle: nil), forCellReuseIdentifier: FilterConfirmCell.identifier)

      controller.popoverPresentationController?.popoverLayoutMargins = UIEdgeInsetsMake(0, 0, 0, 0)

      controller.popoverPresentationController?.delegate = self
      self.present(controller, animated: true, completion: {
        UIView.animate(withDuration: 0.25) {
          controller.view.superview?.layer.cornerRadius = 4
          self.view.alpha = 0.4
        }
      })

      controller.popoverPresentationController?.backgroundColor = UIColor.white
      controller.popoverPresentationController?.sourceView = sender
      controller.popoverPresentationController?.sourceRect = sender.bounds

也实现了adaptivePresentationStyle功能,但仍然没有区别:

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

附加问题

是否可以更改/修改顶部箭头?该箭头似乎太大了,无法使用,还是可以用自定义箭头替换?

编辑

[经过一些调查并打印出controller.view.superview?.frame,我发现它的宽度比应该的小20个点,这解释了弹出窗口两边的空间。但是如何摆脱它呢?

ios swift uitableview uikit uipopovercontroller
2个回答
0
投票

您应该尝试此代码,

override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        var size = self.tableView.contentSize
        size.width = 150.0 //Here, you can set the width.
        self.preferredContentSize = size
}

为了简要理解,我如何创建和呈现popoverController。

@objc open static func instantiate() -> PopOverViewController {
        let storyboardsBundle = getStoryboardsBundle() //Or Bundle.main
        let storyboard:UIStoryboard = UIStoryboard(name: "PopOver", bundle: storyboardsBundle)
        let popOverViewController:PopOverViewController = storyboard.instantiateViewController(withIdentifier: "PopOverViewController") as! PopOverViewController

        popOverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
        popOverViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.up

        // arrow color
        popOverViewController.popoverPresentationController?.backgroundColor = UIColor.darkGray


        return popOverViewController
}

要呈现在特定的ViewController中,

let popover = PopOverViewController.instantiate()
        popover.popoverPresentationController?.sourceView = self.underlyingTextView
        popover.popoverPresentationController?.sourceRect = rect
        popover.presentationController?.delegate = self
        viewController.present(popover, animated: true, completion: nil)

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

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

在ViewDidLoad()中,您可以配置tableView。


0
投票

您可以尝试这个。

controller.popoverLayoutMargins = UIEdgeInsets(top: 0, left: 1, bottom: 0, right: 1)
© www.soinside.com 2019 - 2024. All rights reserved.