【问题标题】:popoverpresentviewcontroller with rectangle corner and without arrow带有矩形角且不带箭头的popover presentviewcontroller
【发布时间】: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)
}

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

请帮我实现:

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

【问题讨论】:

    标签: ios iphone swift uipopovercontroller


    【解决方案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 时这是可能的 - 你有那个工作的样本吗?
          猜你喜欢
          • 1970-01-01
          • 2016-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 2014-03-11
          • 1970-01-01
          相关资源
          最近更新 更多