gpt4 book ai didi

swift - 设置 nspopover 的位置

转载 作者:行者123 更新时间:2023-11-28 12:17:18 24 4
gpt4 key购买 nike

我有一个 View Controller (A),它将另一个 View Controller (B) 显示为弹出窗口。

在我的 VC (A) 中是一个带有 IBAction 的 NSButton:

self.presentViewController(vcPopover, asPopoverRelativeTo: myButton.bounds, of: myButton, preferredEdge: .maxX, behavior: .semitransient)

结果:

enter image description here

现在我想更改弹出窗口的位置 - 我想将其向上移动。

我试过这个:

let position = NSRect(origin: CGPoint(x: 100.0, y: 120.0), size: CGSize(width: 0.0, height: 0.0))
self.presentViewController(vcPopover, asPopoverRelativeTo: position, of: myButton, preferredEdge: .maxX, behavior: .semitransient)

但位置没有改变

另一个例子

enter image description here

我有一个分段控件。如果您单击段“1”,将显示一个弹出窗口(与上面的代码相同)。但是箭头指向段“2”而不是段“1”

最佳答案

首先,确保您的弹出框确实是一个 NSPopover 而不仅仅是一个 NSViewController。假设你想要包装在 popover 中的 View Controller 有一个 Storyboard ID 为“vcPopover”,获取内容 vc 看起来像:

let popoverContentController = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "vcPopover")) as! NSViewController

然后,将其包裹在弹出窗口中:

let popover = NSPopover()
popover.contentSize = NSSize(width: 200, height: 200) // Or whatever size you want, perhaps based on the size of the content controller
popover.behavior = .semitransient
popover.animates = true
popover.contentViewController = popoverContentController

然后,为了演示,请调用 show(relativeTo:of:preferredEdge:) :

vcPopover.show(relativeTo: myButton.bounds, of: myButton, preferredEdge: .maxX)

这应该会更新弹出窗口的位置。

更新:您可能正在使用 NSSegmentedControl,这意味着您需要特别注意在 show 中传递的矩形。您需要在分段控件的坐标系内传递一个 bounds 矩形 来描述分段的区域。这是一个详细的示例:

// The view controller doing the presenting
class ViewController: NSViewController {

...

var presentedPopover: NSPopover?

@IBAction func selectionChanged(_ sender: NSSegmentedControl) {
let segment = sender.selectedSegment

if let storyboard = storyboard {
let contentVC = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("vcPopover")) as! NSViewController

presentedPopover = NSPopover()
presentedPopover?.contentSize = NSSize(width: 200, height: 200)
presentedPopover?.behavior = .semitransient
presentedPopover?.animates = true
presentedPopover?.contentViewController = contentVC
}

presentedPopover?.show(relativeTo: sender.relativeBounds(forSegment: segment), of: sender, preferredEdge: .minY)
}

}

extension NSSegmentedControl {

func relativeBounds(forSegment index: Int) -> NSRect {
// Assuming equal widths
let segmentWidth = bounds.width / CGFloat(segmentCount)

var rect = bounds
rect.size.width = segmentWidth
rect.origin.x = rect.origin.x + segmentWidth * CGFloat(index)

return rect
}

}

请注意,NSSegmentedControl 的扩展使用宽度计算线段的近似矩形。此方法假定宽度相等并且不考虑边框。您可以修改此方法以说明您的需要。可以找到有关获取 iOS 片段框架的信息(类似)here .

只要同一 Storyboard中存在 View Controller 且 Storyboard标识符为“vcPopover”,此示例就会被验证为正常工作。

关于swift - 设置 nspopover 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46022524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com