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

Dan*_*rer 1 macos cocoa

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

其中一个原因是我在左上角使用原点坐标系,需要执行坐标转换.

到目前为止,我无法找到达到这个尺寸的方法,如果有人能给我一个提示,我会很高兴.

我想知道的另一个非常有趣的属性是视图的最小尺寸.

e.J*_*mes 5

不幸的是,没有标准的方法可以为所有NSView子类执行此操作.在您的具体示例中,a中子视图的位置和大小NSBox可以按如下方式计算:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);
Run Code Online (Sandbox Code Playgroud)

如果您经常使用此功能,可以NSBox按如下方式创建类别:

// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end
Run Code Online (Sandbox Code Playgroud)


// MyNSBoxCategories.m
@implementation NSBox (MyCategories)
- (NSRect)contentFrame
{
    NSRect frameRect = [self bounds];
    NSSize margins = [self contentViewMargins];
    return NSInsetRect(frameRect, margins.width, margins.height);
}
@end
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

#import "MyNSBoxCategories.h"

//...

NSRect frameRect = [someNSBox contentFrame];
[myContentView setFrame:frameRect];
[someNSBox addSubview:myContentView];
Run Code Online (Sandbox Code Playgroud)


Jim*_*vey 5

-bounds是您在大多数视图中寻找的那个.然而,NSBox有点特殊,因为你想要查看盒子内容视图的边界,而不是盒子视图本身的边界(盒子视图包括标题,边缘等).此外,bounds rect始终是框的实际大小,而frame rect可以相对于边界进行修改,以将转换应用于视图的内容(例如将200x200图像压缩到200x100帧中).

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