use*_*221 5 layout cocoa objective-c autolayout
我有一个自定义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在这些类中的任何实现也需要一些带外方法(例如,-requestedHeightForWidth:(CGFloat)width在BBView上),此时我不确定这比我自己的ad-hoc -setFrame调用更好(即,CocoaSlides实际上是什么一样).
有人能指出一些实现-layout自定义NSViews的示例代码吗?我只是没有看到它应该如何工作.我完全吠叫错了树吗?
我相信你可以在 BBView 上使用 -intrinsicContentSize 来完成你想要的自动布局,假设我理解这个问题。
\n\n如果您的 BBView 始终希望始终是 AAView 的精确宽度(或接近的宽度),您只需设置标准水平约束即可强制执行此操作。这样就解决了宽度问题。
\n\n要调整高度,请在 BBView 上覆盖 -setFrameSize:,如果宽度已从旧宽度更改,请调用 -invalidateIntrinsicContentSize。
\n\n在 BBView 上的 -intrinsicContentSize 中,您可以查看当前宽度并根据字符串在其中的布局方式计算高度。返回 {self.frame.width,calculatedHeight},你\xe2\x80\x99就可以回家了。(如果 -intrinsicContentSize 被多次调用并且您的布局很昂贵,则对此有明显的优化。)
\n\n编辑:实际上,您应该返回 (NSSize){NSViewNoInstrinsicMetric,calculatedHeight},而不是当前宽度。对不起。
\n| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |