如何更改弹出窗口的大小
How to change the size of a popover
我在更改弹出窗口演示文稿的大小时遇到问题。这是我目前所拥有的
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
if segue.identifier == "popoverView"
{
let vc = segue.destinationViewController
let controller = vc.popoverPresentationController
if controller != nil
{
controller?.delegate = self
controller?.sourceView = self.view
controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
}
}
到目前为止,所做的只是将弹出窗口居中并移除箭头,这很好。但它不会调整容器的大小。任何帮助将不胜感激。谢谢。
当我使用 preferredContentSize 时出现错误 "Cannot assign to property: 'preferredContentSize' is immutable"
在显示的视图控制器上设置首选内容大小,而不是 popoverPresentationController
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
if segue.identifier == "popoverView"
{
let vc = segue.destinationViewController
vc.preferredContentSize = CGSize(width: 200, height: 300)
let controller = vc.popoverPresentationController
controller?.delegate = self
//you could set the following in your storyboard
controller?.sourceView = self.view
controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
}
我通过故事板修复了它:
点击你的控制器
单击属性检查器
ViewController>
选中使用首选显式大小和输入值。
我没有使用故事板。我只是在弹出窗口中显示一个 UINavigationController:
self.present(popoverNavigationController!, animated: true) {}
推送新视图控制器时调整弹出窗口大小的方法,就是在推送之前更改preferredContentSize。例如:
let newViewController = NewViewController()
popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
popoverNavigationController!.pushViewController(newViewController, animated: true)
问题是当我们弹出视图控制器时尝试调整弹出窗口的大小。
如果您使用当前视图控制器的 viewWillDisappear 更改弹出窗口的 preferredContentSize,弹出窗口将调整大小,但在弹出视图控制器之后。也就是说动画有延迟。
在执行popViewController 之前,您必须更改preferredContentSize。这意味着您必须像解释的那样在导航栏中创建一个自定义后退按钮 here。这是为 Swift 4:
更新的实现
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
和运行按下新后退按钮时的下一个代码:
@objc func backButtonTapped(sender: UIBarButtonItem) {
self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200)
self.navigationController?.popViewController(animated: true)
}
基本上,在推送和弹出视图控制器之前必须更改 preferredContentSize。
以上关于使用 preferredContentSize
的回答是正确的,但最重要的是实施协议 UIPopoverPresentationControllerDelegate
并实施以下方法,否则它不会按预期更改内容大小.
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
与上面谢雪山的回答类似,我是通过故事板设置的。
除了 "Presentation" 还需要 "Form Sheet"。
使用自动布局
可能值得一提的是,您可以使用布局约束而不是将 preferredContentSize 设置为特定值。为此,
将此添加到您的视图控制器:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.preferredContentSize = self.view.systemLayoutSizeFitting(
UIView.layoutFittingCompressedSize
)
}
确保从弹出视图到控制器的根视图都有约束。这些可以是低优先级,space >= 0 约束。
我在更改弹出窗口演示文稿的大小时遇到问题。这是我目前所拥有的
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
if segue.identifier == "popoverView"
{
let vc = segue.destinationViewController
let controller = vc.popoverPresentationController
if controller != nil
{
controller?.delegate = self
controller?.sourceView = self.view
controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
}
}
到目前为止,所做的只是将弹出窗口居中并移除箭头,这很好。但它不会调整容器的大小。任何帮助将不胜感激。谢谢。
当我使用 preferredContentSize 时出现错误 "Cannot assign to property: 'preferredContentSize' is immutable"
在显示的视图控制器上设置首选内容大小,而不是 popoverPresentationController
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover
{
if segue.identifier == "popoverView"
{
let vc = segue.destinationViewController
vc.preferredContentSize = CGSize(width: 200, height: 300)
let controller = vc.popoverPresentationController
controller?.delegate = self
//you could set the following in your storyboard
controller?.sourceView = self.view
controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230)
controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}
}
我通过故事板修复了它:
点击你的控制器
单击属性检查器
ViewController>
选中使用首选显式大小和输入值。
我没有使用故事板。我只是在弹出窗口中显示一个 UINavigationController:
self.present(popoverNavigationController!, animated: true) {}
推送新视图控制器时调整弹出窗口大小的方法,就是在推送之前更改preferredContentSize。例如:
let newViewController = NewViewController()
popoverNavigationController!.preferredContentSize = CGSize(width: 348, height: 400)
popoverNavigationController!.pushViewController(newViewController, animated: true)
问题是当我们弹出视图控制器时尝试调整弹出窗口的大小。
如果您使用当前视图控制器的 viewWillDisappear 更改弹出窗口的 preferredContentSize,弹出窗口将调整大小,但在弹出视图控制器之后。也就是说动画有延迟。
在执行popViewController 之前,您必须更改preferredContentSize。这意味着您必须像解释的那样在导航栏中创建一个自定义后退按钮 here。这是为 Swift 4:
更新的实现 self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
和运行按下新后退按钮时的下一个代码:
@objc func backButtonTapped(sender: UIBarButtonItem) {
self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200)
self.navigationController?.popViewController(animated: true)
}
基本上,在推送和弹出视图控制器之前必须更改 preferredContentSize。
以上关于使用 preferredContentSize
的回答是正确的,但最重要的是实施协议 UIPopoverPresentationControllerDelegate
并实施以下方法,否则它不会按预期更改内容大小.
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
与上面谢雪山的回答类似,我是通过故事板设置的。
除了 "Presentation" 还需要 "Form Sheet"。
使用自动布局
可能值得一提的是,您可以使用布局约束而不是将 preferredContentSize 设置为特定值。为此,
将此添加到您的视图控制器:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.preferredContentSize = self.view.systemLayoutSizeFitting( UIView.layoutFittingCompressedSize ) }
确保从弹出视图到控制器的根视图都有约束。这些可以是低优先级,space >= 0 约束。