objective-c – 如何覆盖NSView的-layout方法?

objective-c – 如何覆盖NSView的-layout方法?,第1张

概述我有一个自定义NSViews的层次结构,我以不受autolayout约束支持的样式进行布局.现在,我只是在观看调整大小事件,并在我的所有子视图(及其子视图……)上调用-setFrame,但就源代码复杂性而言,这不是很好的扩展. (当我在层次结构的底部添加一个新的子视图时,我必须在顶视图中添加其布局逻辑 – 这似乎并不理想.) 正如我所理解的,解决这个问题的正确方法覆盖NSView的-layout 我有一个自定义NSVIEws的层次结构,我以不受autolayout约束支持的样式进行布局.现在,我只是在观看调整大小事件,并在我的所有子视图(及其子视图……)上调用-setFrame,但就源代码复杂性而言,这不是很好的扩展. (当我在层次结构的底部添加一个新的子视图时,我必须在顶视图中添加其布局逻辑 – 这似乎并不理想.)

正如我所理解的,解决这个问题的正确方法是覆盖NSVIEw的-layout方法(当我想在树的某个层面强制布局时调用-setNeedsLayout).

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

例如,假设我有一个AAVIEw(NSVIEw),里面有一些BBVIEw,它显示一些自动换行的文本,并且它想要以100%的宽度显示它们(我认为,模糊地像一个nsstackview,虽然这是Cocoa的另一个完全没有记载的功能).

因为BBVIEws的高度取决于它们的宽度(由于它们的自动换行),所以它们不能具有-intrinsicContentSize(正确?). AAVIEw的-layout方法想要放置BBVIEws,即设置它们的frameSize和frameOrigin.但是,为了了解BBVIEw的大小,它需要询问BBVIEw – 但BBVIEw无法在其-layout方法中设置自己的大小(仅适用于其子视图,如果有的话).因此,这些类中的-layout的任何实现也需要一些带外方法(例如,BBVIEw上的-requestedHeightForWIDth:(CGfloat)宽度),此时我不确定这比我自己的广告更好-hoc -setFrame调用(即CocoaSlIDes实际执行的 *** 作).

有人可以指出一些示例代码实现自定义NSVIEw的-layout吗?我只是没有看到它应该如何工作.我完全吠叫错了树吗?

解决方法 我相信你可以在BBVIEw上使用-intrinsicContentSize使用autolayout做你想要的,假设我理解了这个问题.

如果您的BBVIEw始终希望始终是AAVIEw的精确宽度(或接近该宽度),您可以设置标准水平约束来强制执行此 *** 作.这解决了宽度.

要执行高度,请在BBVIEw上覆盖-setFrameSize:如果宽度已从旧宽度更改,请调用-invalIDateIntrinsicContentSize.

在BBVIEw上的-intrinsicContentSize中,您可以查看当前宽度并根据字符串在其中的布局方式计算高度.返回{self.frame.wIDth,calculatedHeight},你就可以回家了. (如果-intrinsicContentSize被大量调用并且您的布局很昂贵,那么对此有明显的优化.)

编辑:实际上,你应该返回(NSSize){NSVIEwNoInstrinsicmetric,而不是当前的宽度.抱歉.

总结

以上是内存溢出为你收集整理的objective-c – 如何覆盖NSView的-layout方法?全部内容,希望文章能够帮你解决objective-c – 如何覆盖NSView的-layout方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1009967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存