一侧的 NSPopover 填充内容

Posted

技术标签:

【中文标题】一侧的 NSPopover 填充内容【英文标题】:NSPopover padding content on one side 【发布时间】:2013-05-14 16:22:12 【问题描述】:

我有两个 NSPopover,它们的设置完全相同(只是从 IB 链接自定义 NSView)。两者都可以正常弹出,但其中一个似乎将内容偏移了大约 20 像素。

这个 NSPopover (正确地)没有填充内容...

但是这个从骑行侧增加了大约 20 像素。

这是 IB 中列出的两个视图

如您所见,搜索栏应该固定在右侧,就像它是左侧一样,但由于某种原因它不是。起初我以为是约束问题,但在搞砸了一段时间后,我可以确认不是。

有什么线索吗?

编辑:决定子类化视图并填充它的矩形,得到了一些非常奇怪的结果!视图似乎是偏移的。我不知道这是为什么......

【问题讨论】:

我没有答案,但appears to be padding the content on one side by about 20px. 的评论似乎具有误导性。应用程序屏幕截图中的搜索栏与笔尖屏幕截图中的宽度完全相同。这表明问题在于它根本没有调整大小,而不是那里有右边距。 是的,这是我最初的猜测,但是在运行了这个小测试之后,我发现这确实是错误的。现在看起来好像内容视图偏移了大约 20px... 向自定义内容视图类的setFrame: 方法添加一些日志记录,并在您使用它时记录superview 的框架。 @***foe 好主意。从该测试看来,正确的视图设置为 x: 13 y: 13 的帧,其中不正确的视图设置为 x: 0 y: 0 是时候深入挖掘了! 好的问题解决了!我覆盖了 setFrame 属性,并强制它将 x 和 y 更改为 13、13。在此初始点之后调用 setFrame 无效,因此需要进行覆盖。谢谢大家! 【参考方案1】:

来自here,这引起了我的注意(重点是我的):

你不应该打电话的主要情况 setTranslatesAutoresizingMaskIntoConstraints: 是当你不是 指定视图与其容器的关系的人。例如, NSTableRowView 实例由NSTableView 放置。它可能会这样做 通过允许将自动调整大小掩码转换为约束, 或者它可能不会。这是一个私有的实现细节。其他观点 你不应该打电话 setTranslatesAutoresizingMaskIntoConstraints: 包括一个 NSTableCellViewNSSplitView 的子视图,NSTabViewItem 的视图,或 NSPopoverNSWindowNSBox 的内容视图。对于那些 熟悉经典的 Cocoa 布局:如果你不会调用 setAutoresizingMask: 在经典风格的视图上,你不应该打电话 setTranslatesAutoresizingMaskIntoConstraints: 在自动布局下。

它适用于你吗?

【讨论】:

嗯,我从不直接调用该方法,我尝试禁用自动布局无济于事。我感觉这与 contentViewControllers 视图没有填满整个空间有关。 @AtlasWegman 那么您是否使用自动布局(约束)或不使用(弹簧和支柱)? 我都试过了,都没有。这是我的 spring 和 strut 布局cl.ly/OxvC,它应该扩展了搜索字段以填充整个 NSPopover,但它仍然与上图相同 @AtlasWegman 实际的内容视图本身呢?在我自己使用弹出框时,我将视图的大小设置为这样(我没有使用约束,如果这很重要的话):dl.dropboxusercontent.com/u/18450868/… 只是试了一下,没有运气。好主意!【参考方案2】:

如果您有内容视图的出口,您应该能够通过以下方式强制它到位:

[contentView setFrame:[[contentView superview]bounds]];

或者更现代的我猜...

contentView.frame = contentView.superview.bounds;

【讨论】:

出于某种原因,在初始调用之外调用 setFrame 方法无效。结果,我继承了 NSView 并覆盖了 setFrame 方法,强制它的 x, y 为 13, 13。感谢您的回复!【参考方案3】:

问题已解决,但我仍然不知道为什么需要解决。 NSPopovers 内容视图(或至少是我的)需要 X: 13, Y: 13 的原点。出于某种原因,我只有一个视图获得了这个值。

为了解决这个问题,我继承了 NSView 并覆盖了 setFrame 方法,强制其 x 和 y 始终为 13、13

-(void)setFrame:(NSRect)frameRect 
    [super setFrame:NSMakeRect(13, 13, frameRect.size.width, frameRect.size.height)];

【讨论】:

这听起来不像是我的答案。加上对幻数的猜测不是专业的编程。这里真正有什么问题意味着您需要 13 的值? 你说得对,这不是解决问题的方法,而是解决我的问题。如果我发现任何东西,我会继续调查和编辑,但我认为添加以上内容作为答案将有助于任何未来的人深入了解他们问题的根源。

以上是关于一侧的 NSPopover 填充内容的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:popover.show 后重新初始化

从 Popover 中显示的 TableView 中的单元格填充 textField

iOS:iOS13显示popover边框的问题

从popover返回后如何在collectionview单元格中填充文本字段

仅在一侧向 tkinter 小部件添加填充

检查菜单栏应用程序上的按键