正如我所理解的,解决这个问题的正确方法是覆盖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方法?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)