首页
学习
活动
专区
圈层
工具
发布

定位
EN

Stack Overflow用户
提问于 2017-09-03 10:33:04
回答 1查看 2.2K关注 0票数 2

我有一个视图控制器(A),它将显示另一个视控制器(B)作为弹出器。

在我的VC (A)中有一个NSButton,它的IBAction:

代码语言:javascript
复制
self.presentViewController(vcPopover, asPopoverRelativeTo: myButton.bounds, of: myButton, preferredEdge: .maxX, behavior: .semitransient)

结果:

现在我想改变我的位置,我想把它向上移动。

我试过这个:

代码语言:javascript
复制
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)

但情况并没有改变

另一个示例

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 15:51:39

首先,确保您的popover是一个NSPopover,而不是简单的NSViewController。假设您想要包装的视图控制器有一个故事板id "vcPopover",那么获取内容vc如下所示:

代码语言:javascript
复制
let popoverContentController = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "vcPopover")) as! NSViewController

然后,将其包装在一个弹出框中:

代码语言:javascript
复制
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:)

代码语言:javascript
复制
vcPopover.show(relativeTo: myButton.bounds, of: myButton, preferredEdge: .maxX)

这将更新弹出器的位置。

更新:您可能在使用NSSegmentedControl,这意味着您需要特别注意在show中传递的rect。您需要在分段控件的坐标系统中传递一个边界rect,该坐标系描述分段控件的区域。下面是一个详细的例子:

代码语言:javascript
复制
// 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

只要视图控制器存在于同一情节提要中,且故事板标识符为"vcPopover“,则此示例被验证为正确工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46022524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档