popoverpresentviewcontroller 带矩形角和无箭头

popoverpresentviewcontroller with rectangle corner and without arrow

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

我已经完成了以下代码,但没有成功:

//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)
}

我能够显示带箭头和圆形箭头的弹出视图。

请帮我实现:

要在启动弹出窗口时获得没有箭头的弹出窗口,请使用:

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;
    }

利用上面的概念,也可以在补全参数中设置圆角半径

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
})

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

半径必须在 viewDidAppear 方法中设置

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

我不知道为什么它不能在我的模拟器上使用 iOS11.1 工作,直到尝试设置 backgroundColor.I 为旋转设备添加功能 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)
}

对于 Swift 4,如果您展示嵌入在导航控制器中的弹出窗口:

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

我对 的回答不是 100% 满意,因为我意识到从圆角到矩形的变化是 notable/visible。

所以我想到了这个:子类化视图控制器(在我的例子中它是一个 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
        }
    }
}

我就是这样做的,以实现这样的功能,该功能也适用于设备旋转:

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

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)

其中许多答案解决了 OP 关于角半径的问题,但您可以通过将呈现的视图控制器的顶视图的背景更改为清除来获得相同的效果。然后将下一个顶视图的角圆化到所需的量(或者不是,如果你想让它成为一个直顶)。

我更喜欢这种方式,因为它可以让您更好地控制所呈现的视图。例如,您可以通过在视图控制器中将视图居中并呈现它来呈现一个浮动的正方形。