我正在为我的Cocoa应用程序进行手动布局,在某些时候我需要弄清楚NSView子类的内部大小是什么.(例如,我的子视图在NSBox中可用的高度是多少?)
其中一个原因是我在左上角使用原点坐标系,需要执行坐标转换.
到目前为止,我无法找到达到这个尺寸的方法,如果有人能给我一个提示,我会很高兴.
我想知道的另一个非常有趣的属性是视图的最小尺寸.
不幸的是,没有标准的方法可以为所有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)
-bounds是您在大多数视图中寻找的那个.然而,NSBox有点特殊,因为你想要查看盒子内容视图的边界,而不是盒子视图本身的边界(盒子视图包括标题,边缘等).此外,bounds rect始终是框的实际大小,而frame rect可以相对于边界进行修改,以将转换应用于视图的内容(例如将200x200图像压缩到200x100帧中).
因此,对于您刚刚使用的大多数视图[parentView bounds],对于您将使用的NSBox [[theBox contentView] bounds],您将使用[[theBox contentView] addSubview: myView]而不是[parentView addSubview: myView]添加您的内容.
| 归档时间: |
|
| 查看次数: |
3185 次 |
| 最近记录: |