带有矩形角且不带箭头的popover presentviewcontroller

Posted

技术标签:

【中文标题】带有矩形角且不带箭头的popover presentviewcontroller【英文标题】:popoverpresentviewcontroller with rectangle corner and without arrow 【发布时间】:2016-07-26 14:06:59 【问题描述】:

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

我已经完成了以下代码,但它没有工作:

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

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

请帮我实现:

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

【问题讨论】:

【参考方案1】:

利用上面的概念,你也可以在完成参数中设置圆角半径。

斯威夫特 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 10.3.3 非常感谢!你拯救了我的一天,你是我的救星 如果屏幕旋转则会中断。每次方向改变时都需要设置。【参考方案2】:

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

必须在 viewDidAppear 方法中设置半径

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

【讨论】:

你的答案是正确的,但是在 iOS 11 上,如果我们旋转设备,圆角半径会回来。暂时不知道怎么解决。【参考方案3】:

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

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;
    

【讨论】:

@SurajLokhande 如果它对你有用,你能接受答案吗?【参考方案4】:

我对@9​​87654321@ 的回答不是 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】:

我不知道为什么它在我的 iOS11.1 模拟器上不起作用,直到尝试设置 backgroundColor。我添加了用于旋转设备的函数 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)

【讨论】:

嗨,欢迎来到 SO 并感谢您的回答。为了使其对其他用户更有用,它有助于解释原始代码的问题所在以及您的代码如何改进【参考方案6】:

对于 Swift 4,如果您将弹出框显示在导航控制器中:

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

【讨论】:

【参考方案7】:

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

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

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)

【讨论】:

【参考方案8】:

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

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

【讨论】:

我不相信当你不使用 UIModalPresentationStyle.OverCurrentContext 时这是可能的 - 你有那个工作的样本吗?

以上是关于带有矩形角且不带箭头的popover presentviewcontroller的主要内容,如果未能解决你的问题,请参考以下文章

将 s3 文件复制到带有 IDENTITY 列且不带 EXPLICIT_IDS 的 Redshift 表

reactjs上带有和不带箭头功能的不同输出获取json

Onclick 显示/隐藏仅 div 且不带 href 的 css。没有jQuery

如何删除 iPad 的 Popover 箭头及其边框

Popover箭头与viewcontroller背景颜色不同

popover带箭头弹框