popoverpresentviewcontroller与矩形角和没有箭头

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

我已经完成了以下代码,但它不起作用:

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

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

请帮我实现:

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

我对shawnynicole的答案并不十分满意,因为我意识到从圆角到矩形角的变化是显着的/可见的。

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

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

斯威夫特3

 let popoverViewController: UIViewController = // Some view controller to be presented in a popover // Set popover properties here... // ie popoverViewController.modalPresentationStyle = .popover present(popoverViewController, animated: true, completion: { popoverViewController.view.superview?.layer.cornerRadius = 0 // Additional code here }) 

在iOS 11中,不可能使用@SHN解决方案来删除圆角。 在viewWillAppear之后,角半径设置为默认值。

必须在viewDidAppear方法中设置Radius

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

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

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

在尝试设置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) } 

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

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