Cocoa 如何获取NSView子类的内部/客户端大小?

Cocoa 如何获取NSView子类的内部/客户端大小?,cocoa,macos,Cocoa,Macos,我正在为Cocoa应用程序进行手动布局,在某个时候,我需要弄清楚NSView子类的内部大小。(例如,NSBox内“我的孩子”视图的可用高度是多少?) 原因之一是我使用的坐标系原点在左上角,需要执行坐标变换 到目前为止,我想不出一个办法来达到这个尺寸,如果有人能给我一个提示,我会很高兴的 我想知道的另一个非常有趣的属性是视图的最小大小。NSView的bounds属性返回一个带有原点(通常为(0,0))和NSView大小的NSRect。请参阅。NSView的bounds属性返回一个带有原点(通常为(

我正在为Cocoa应用程序进行手动布局,在某个时候,我需要弄清楚NSView子类的内部大小。(例如,NSBox内“我的孩子”视图的可用高度是多少?)

原因之一是我使用的坐标系原点在左上角,需要执行坐标变换

到目前为止,我想不出一个办法来达到这个尺寸,如果有人能给我一个提示,我会很高兴的


我想知道的另一个非常有趣的属性是视图的最小大小。

NSView的
bounds
属性返回一个带有原点(通常为(0,0))和NSView大小的NSRect。请参阅。

NSView的
bounds
属性返回一个带有原点(通常为(0,0))和NSView大小的NSRect。请看。

我不确定(我从来没有深入研究过这些东西),但这不是[NSView界限]吗

我不确定(我从来没有深入研究过这些东西),但这不是[NSView bounds]吗


不幸的是,对于所有NSView子类,都没有标准的方法来实现这一点。在您的特定示例中,
NSBox
中的子视图的位置和大小可以计算如下:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);
// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end
如果您经常使用此功能,您可以在
NSBox
上创建一个类别,如下所示:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);
// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end

你可以这样使用它:

#import "MyNSBoxCategories.h"

//...

NSRect frameRect = [someNSBox contentFrame];
[myContentView setFrame:frameRect];
[someNSBox addSubview:myContentView];

不幸的是,对于所有NSView子类都没有标准的方法来实现这一点。在您的特定示例中,
NSBox
中的子视图的位置和大小可以计算如下:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);
// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end
如果您经常使用此功能,您可以在
NSBox
上创建一个类别,如下所示:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);
// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end

你可以这样使用它:

#import "MyNSBoxCategories.h"

//...

NSRect frameRect = [someNSBox contentFrame];
[myContentView setFrame:frameRect];
[someNSBox addSubview:myContentView];

-bounds
是您在大多数视图中查找的边界。但是,NSBox有点特殊,因为您希望查看框的内容视图的边界,而不是框视图本身的边界(框视图包括标题、边等)。此外,bounds rect始终是框的实际大小,而frame rect可以相对于边界进行修改,以对视图内容应用变换(例如将200x200图像压缩为200x100帧)


因此,对于大多数视图,您只需使用
[parentView-bounds]
,对于NSBox,您将使用
[[theBox-contentView]bounds]
,您将使用
[[theBox-contentView]addSubview:myView]
而不是
[parentView-addSubview:myView]
添加您的内容。

-bounds
是您在大多数视图中查找的内容。但是,NSBox有点特殊,因为您希望查看框的内容视图的边界,而不是框视图本身的边界(框视图包括标题、边等)。此外,bounds rect始终是框的实际大小,而frame rect可以相对于边界进行修改,以对视图内容应用变换(例如将200x200图像压缩为200x100帧)


因此,对于大多数视图,您只需使用
[parentView-bounds]
,对于NSBox,您将使用
[[theBox-contentView]bounds]
,您将使用
[[theBox-contentView]addSubview:myView]
而不是
[parentView-addSubview:myView]
来添加内容。

谢谢您的回复。我应该使用另一个例子,因为NSBox确实有些特殊,因为它有许多其他类所缺少的额外方法:(没问题,[someView bounds]到底是不是你想要的答案?:)谢谢你的回答。我应该使用另一个例子,因为NSBox确实有些特殊,因为它有许多其他类所缺少的额外方法:(没问题,[someView bounds]到底是不是你想要的答案?:)