Ted*_*opp 7 iphone popover ios swift3
我试图定义一个附加到这样的视图的弹出视图:
这是我的代码:
class MyController: UIViewController, UIPopoverPresentationControllerDelegate {
...
func displaySignOut(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil)
.instantiateViewController(withIdentifier: "signOutPopover")
vc.modalPresentationStyle = .popover
vc.preferredContentSize = CGSize(width: 100, height: 30)
present(vc, animated: true, completion: nil)
let pc = vc.popoverPresentationController!
pc.sourceView = sender
pc.sourceRect = sender.bounds
pc.delegate = self
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
}
Run Code Online (Sandbox Code Playgroud)
因为弹出窗口很小,所以我想在所有设备上使用这种样式。我已遵循通常的建议(例如,此处)来覆盖adaptivePresentationStyle返回UIModalPresentationStyle.none。
在iPad设备上可以正常使用,但在iPhone上则不能。在较小的iPhone设备上,它始终会全屏显示。在较大的屏幕(例如iPhone 7 Plus)上,出现了错误,但是,如果我在弹出窗口出现后旋转设备,则会奇怪地切换到弹出窗口演示(纵向和横向)。(如果我关闭弹窗并再次将其抬起,直到再次旋转设备,这都是错误的。)此外,在横向模式下,它会以奇怪的配置显示(不是全屏显示,如纵向):
与弹出式演示文稿不同,如果在弹出式视图本身之外点击,这不会消失。
在苹果的文档说,(部分):
在水平紧凑的环境中,
UIModalPresentationOverFullScreen默认情况下,弹出框会适应演示样式。
“默认情况下”强烈建议有一种方法可以覆盖此行为。但是(与这篇文章一致),adaptivePresentationStyle在委托中的重写似乎不再是这样做的方法(尽管它曾经可以工作)。那么,有没有一种新方法可以修改默认行为?
我正在使用针对iOS 9+的XCode 8.3.3和Swift 3.1。
我创建了一个自定义类,其中包含连接按钮出口的故事板并实现了以下代码。
import UIKit
class PopOverViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.backgroundColor = UIColor.purple
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//Updating the popover size
override var preferredContentSize: CGSize {
get {
let size = CGSize(width: 80, height: 60)
return size
}
set {
super.preferredContentSize = newValue
}
}
//Setup the ViewController for popover presentation
func updatePopOverViewController(_ button: UIButton?, with delegate: AnyObject?) {
guard let button = button else { return }
modalPresentationStyle = .popover
popoverPresentationController?.permittedArrowDirections = [.any]
popoverPresentationController?.backgroundColor = UIColor.purple
popoverPresentationController?.sourceView = button
popoverPresentationController?.sourceRect = button.bounds
popoverPresentationController?.delegate = delegate
}
}
Run Code Online (Sandbox Code Playgroud)
然后Inside ViewController实现了一个在iphone上显示popOver的功能
func showPopOver(button: UIButton!) {
let viewController = PopOverViewController()
viewController.updatePopOverViewController(button, with: self)
present(viewController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
注意:- 经过测试,这应该适用于纵向和横向模式