ios 为什么“作为弹出框出现”的连续句覆盖了整个屏幕?

vjhs03f7  于 2023-05-19  发布在  iOS
关注(0)|答案(6)|浏览(155)

在我的项目中,我在屏幕的右下角有一个按钮,我在故事板上添加了另一个uiviewcontroller,并控制拖动到我想要的uiviewcontroller作为弹出窗口,然后将viewcontroller大小设置为(300,300)并选中“使用首选的显式大小”。当我加载应用程序并点击按钮时,整个屏幕都会被“popover”覆盖。我还尝试进入popoverViewController的.m文件并设置大小,但这也不起作用。
有什么想法吗
编辑:因为它看起来像我必须有它是全屏,这是好的,但我仍然遇到了一些其他问题,我早些时候。我的弹出屏幕将出现,我使背景黑色和阿尔法为0.5,使它通过,但它会做动画,然后一旦动画完成,屏幕将从0.5不透明到完全黑色,我唯一能看到的是电池图标的事情。

huwehgph

huwehgph1#

OP使用Objective-C。这个答案在swift中给出了代码。将Swift转换为Objective-C应该很容易。
在新添加的ViewController中,在“模拟度量”下,将“大小”更改为“自由形式”,将“状态栏”更改为“无”。
在“模拟大小”下,将视图的高度和宽度更改为您希望弹出框内容的实际大小。
创建到新添加的VC的segue。使用segue类型作为“Present As Popover”,并为segue给予,例如“popoverSegue”。
在要触发此segue的ViewConroller中,添加UIPopoverPresentationControllerDelegate协议。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

重写prepareForSegue函数以捕获弹出框segue。将modalPresentationStyle设置为.Popover以显式声明您想要一个弹出框,然后将视图的popoverPresentationController的delegate属性分配给self:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

实现adaptivePresentationStyleForPresentationController函数,以告诉您的应用您确实需要该弹出窗口演示文稿,并且不接受任何替换:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }

在这些之后,我可以在iPhone上得到一个弹出窗口,它不是全屏,而是为ViewController设置的大小。

来源:iPad Style Popovers on the iPhone with Swift

rjee0c15

rjee0c152#

多亏了Bharat for the great answer,我个人使用了一个UISoryboardSegue,它做了几乎相同的事情。这样,我就可以改变故事板中segue的类,得到我想要的,而不会污染我的控制器:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}
acruukt9

acruukt93#

Swift 3-5版本

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SEGUE_IDENTIFIER" {
            let popoverViewController = segue.destination as! YourViewController
            
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }
    
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
bqucvtff

bqucvtff4#

Swift 4版本

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

别忘了加上

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
n1bvdmb6

n1bvdmb65#

在iPhone上,你可以创建一个自定义的视图控制器来管理所有的弹出窗口。因为每个视图控制器都有自己的导航控制器,所以可以将一个新的视图控制器作为du视图添加到app.window.rootviewcontroller中,并将所有的视图控制器放在前面。
如果你不想自己写,你可以使用这样的东西:http://cocoapods.org/pods/FPPopover

imzjd6km

imzjd6km6#

这是Swift 5代码,上面提到的一些/大部分解决方案都是有效的。这是一个提出整体解决方案的努力。这个例子假设你正在使用一个xib作为popover视图控制器,但是这也可以在其他情况下工作,比如说,在prepare for segue中。下面是一个完整的代码:
呈现ViewController:

let popoverVC = PopoverVC(nibName: "popoverVC", bundle: nil)
popoverVC.completionHandler = { [unowned self] (itemIndex : Int?) in
    if let itemIndex = itemIndex
    {
         // Do completion handling
    }
}

popoverVC.preferredContentSize = CGSize(width: 200, height: 60)
popoverVC.modalPresentationStyle = .popover

if let pvc = popoverVC.popoverPresentationController {
    pvc.permittedArrowDirections = [.down]
    pvc.delegate = self
    pvc.sourceRect = button.frame
    pvc.sourceView = button // Button popover is presented from
    present(popoverVC, animated: true, completion: nil)
}

这一点很重要:

extension ViewController: UIPopoverPresentationControllerDelegate {
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }
}

相关问题