gpt4 book ai didi

objective-c - NSView 的 -layout 方法的覆盖到底应该如何工作?

转载 作者:太空狗 更新时间:2023-10-30 03:54:44 29 4
gpt4 key购买 nike

我有一个自定义 NSView 的层次结构,我以自动布局约束不支持的样式进行布局。现在,我只是在观察调整大小事件,并在我的所有 subview (及其 subview ...)上调用 -setFrame,但就源代码复杂性而言,这并不能很好地扩展。 (当我在层次结构的底部添加一个新的 subview 时,我必须在顶层 View 中向上添加它的布局逻辑——这看起来并不理想。)

据我所知,解决这个问题的正确方法是覆盖 NSView 的 -layout方法(然后当我想在树的某个级别强制布局时调用 -setNeedsLayout)。

不幸的是,它的文档有点简洁,而且(尽管那里有“CocoaSlides”链接)Apple 没有覆盖此方法的示例代码。我尝试在 Github 上搜索,但事实证明“布局”在 Objective-C 代码中是一个相当常见的词,我还没有找到我想要的那个。

例如,假设我有一个 AAView (NSView),其中有一些 BBView,其中显示了一些自动换行的文本,并且它希望以其自身宽度的 100% 显示它们(有点像 NSStackView,我认为,尽管这是 Cocoa 的另一个完全未记录的功能)。

因为 BBView 的高度取决于它们的宽度(由于它们的自动换行),所以它们不能有 -intrinsicContentSize(对吗?)。 AAView 的 -layout 方法想要放置 BBViews,即设置它们的 frameSize 和 frameOrigin。但是,为了知道 BBView 的大小,它需要询问 BBView——但是 BBView 无法在其 -layout 方法中设置其自己的大小(仅针对其 subview ,如果有的话)。因此,这些类中的任何 -layout 实现也需要一些带外方法(例如,BBView 上的 -requestedHeightForWidth:(CGFloat)width),位于我不确定这是否比我自己的临时 -setFrame 调用(即 CocoaSlides 实际执行的操作)更好。

有人可以指点我一些为自定义 NSView 实现 -layout 的示例代码吗?我只是不明白这应该如何工作。我是不是找错了树?

最佳答案

我相信您可以在 BBView 上使用 -intrinsicContentSize 来使用自动布局来做您想做的事情,前提是我理解这个问题。

如果您的 BBView 总是希望始终与您的 AAView 宽度相同(或接近该宽度),您可以设置标准水平约束来强制执行此操作。这解决了宽度问题。

要设置高度,请覆盖 BBView 上的 -setFrameSize:,如果宽度已从旧宽度更改,请调用 -invalidateIntrinsicContentSize。

在 BBView 上的 -intrinsicContentSize 中,您查看当前宽度并根据字符串在其中的布局计算高度。返回 {self.frame.width, calculatedHeight} 就可以无家可归了。 (如果 -intrinsicContentSize 被多次调用并且您的布局很昂贵,则对此有明显的优化。)

编辑:实际上,您应该返回 (NSSize){NSViewNoInstrinsicMetric, calculatedHeight},而不是当前宽度。对不起。

关于objective-c - NSView 的 -layout 方法的覆盖到底应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21031965/

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