popoverpresentviewcontroller与矩形角和没有箭头

时间:2016-07-26 14:07:00

标签: ios iphone swift uipopovercontroller

我想要一个没有圆角且没有箭头的弹出窗口。

我已完成以下代码,但它无效:

// SerachPopViewController.swift

    //MARK: InitCoder
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    //popover settings
    //popoverPresentationController!.permittedArrowDirections = .Any
    modalPresentationStyle = .Popover
    popoverPresentationController!.delegate = self
    //permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
    self.preferredContentSize = CGSize(width:340,height:380)
}

// QueryTableViewController.swift

    @IBAction func searchFilter(sender: AnyObject) {

    let searchPopController = storyboard!.instantiateViewControllerWithIdentifier("SerachPopViewController") as! SerachPopViewController
    searchPopController.serachPopDelegate = self
    searchPopController.modalPresentationStyle = .Popover
    searchPopController.preferredContentSize = CGSize(width:340,height:380)

    let popoverPresentationController = searchPopController.popoverPresentationController

    popoverPresentationController!.sourceView = self.view;
    popoverPresentationController!.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0)
    popoverPresentationController!.permittedArrowDirections = UIPopoverArrowDirection();
    self.presentViewController(searchPopController, animated: true, completion: nil)
}

我可以使用箭头和圆形箭头显示弹出窗口视图。

请帮助我实现:

  • 带有矩形角的弹出式视图
  • 没有方向箭头的弹出视图

8 个答案:

答案 0 :(得分:24)

使用上述概念,您还可以在完成参数中设置角半径。

Swift 3

let popoverViewController: UIViewController = // Some view controller to be presented in a popover

// Set popover properties here...
// i.e. popoverViewController.modalPresentationStyle = .popover

present(popoverViewController, animated: true, completion: {
     popoverViewController.view.superview?.layer.cornerRadius = 0

    // Additional code here
})

答案 1 :(得分:7)

在iOS 11中,无法使用@SHN解决方案去除圆角。在viewWillAppear之后,角半径设置为默认值。

必须在viewDidAppear方法

中设置半径
override func viewDidAppear(_ animated: Bool) {
    view.superview?.layer.cornerRadius = 0
    super.viewDidAppear(animated)
}

答案 2 :(得分:4)

要在启动弹出窗口时不使用箭头弹出窗口,请使用:

popover!.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

对于没有角半径的弹出窗口,在弹出框内容视图控制器中使用:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        // Do any additional setup after loading the view, typically from a nib.
        self.view.superview?.layer.cornerRadius = 0.0;
    }

答案 3 :(得分:1)

在尝试设置backgroundColor之前,我不知道为什么它在iOS11.1模拟器上不起作用。我为旋转设备添加了函数viewWillTransition。

override func viewDidAppear(_ animated: Bool) {
    view.superview?.backgroundColor = UIColor.white
    view.superview?.layer.cornerRadius = 0
    super.viewDidAppear(animated)
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    view.superview?.backgroundColor = UIColor.white
    view.superview?.layer.cornerRadius = 0
    super.viewWillTransition(to: size, with: coordinator)
}

答案 4 :(得分:1)

我对shawnynicole's的回答不是100%满意,因为我意识到从圆角到矩形角的变化是明显/可见的。

所以我想出了这个:子类化视图控制器(在我的情况下是UINavigationController)并覆盖viewDidLayoutSubviews并在那里更新角点。这样比较好,因为转角动画不可见,并且每次需要时都会更新(旋转等)。

它可以在iOS11中运行,并且可能也应该在其他版本上运行。

class PopoverNavigationController: UINavigationController {

    @IBInspectable var cornerRadius: Int = -1

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let r = CGFloat(cornerRadius)
        if r >= 0 && view.superview?.layer.cornerRadius != r {
            view.superview?.layer.cornerRadius = r
        }
    }
}

答案 5 :(得分:0)

对于 Swift 4 ,如果您将弹出式窗口展示在导航控制器中,则为

override func viewDidAppear(_ animated: Bool) {
        navigationController?.view.superview?.layer.cornerRadius = 0
        super.viewDidAppear(animated)
}

答案 6 :(得分:0)

我就是这样做的,以实现在设备旋转时也可以使用的功能:

在您设置为弹出窗口的视图控制器中,添加以下代码:

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        view.superview?.layer.cornerRadius = 0
}

extension MyPopoverViewController: UIPopoverPresentationControllerDelegate {
    func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>) {
        self.view.setNeedsLayout()
    }

最后,在显示它之前,将弹出菜单的delegate设置为此视图控制器的实例:

...
popover.delegate = myPopoverViewController
present(myPopoverViewController, animated: true)

答案 7 :(得分:0)

许多这些答案解决了OP关于拐角半径的问题,但是您可以通过将呈现的视图控制器的顶视图背景更改为透明来获得相同的效果。然后,只需将下一个顶视图的拐角处的圆角调整到所需的数量即可(或者,如果您希望它是直的顶部,则不可以)。

我更喜欢这种方式,因为它为您提供了对所显示视图的更多所见即所得的控制。例如,您可以通过在视图控制器中将视图居中并将其呈现来呈现一个浮动正方形。