Objective c setPatternPhase问题:在NSColor的NSSplitView中,使用colorWithPatternImage:

Objective c setPatternPhase问题:在NSColor的NSSplitView中,使用colorWithPatternImage:,objective-c,cocoa,user-interface,Objective C,Cocoa,User Interface,我到处找了找,没有找到关于这个问题的任何东西。我有一个垂直的窗户。在splitview的右视图中,我设置了一个NSBox对象来填充视图的内容。我正在使用setContentView加载自定义NIB:将视图交换到splitview右侧的NSBox。在我的自定义视图中,我将使用NSColor对象填充视图,该对象使用NSImage对背景进行填充。所有这些都如预期的那样起作用。我使用基于本文的代码:将模式的阶段设置为左上角: [[NSGraphicsContext currentContext] sav

我到处找了找,没有找到关于这个问题的任何东西。我有一个垂直的窗户。在splitview的右视图中,我设置了一个NSBox对象来填充视图的内容。我正在使用setContentView加载自定义NIB:将视图交换到splitview右侧的NSBox。在我的自定义视图中,我将使用NSColor对象填充视图,该对象使用NSImage对背景进行填充。所有这些都如预期的那样起作用。我使用基于本文的代码:将模式的阶段设置为左上角:

[[NSGraphicsContext currentContext] saveGraphicsState];
[[NSGraphicsContext currentContext] setPatternPhase: NSMakePoint( [self bounds].origin.x, 
                                                                 [self bounds].size.height )];
[[self leatherColor] set];
NSRectFill( [self bounds] );

[[NSGraphicsContext currentContext] restoreGraphicsState];
当视图按照预期行为(通过splitview移动或窗口本身调整大小)重新调整大小时,图案在NSBox的左上角保持不变。我已经在一个精简的测试应用程序中实现了这一点,它只有一个窗口和一个自定义视图,并且它的行为符合预期

然而,在我使用splitview的项目中,它的行为就像patternPhase被设置在整个窗口的左上角,而不是splitview右半部分的左上角(即,它应该随着splitview大小的调整而移动),它的行为就像“显示更大的图像,而不是随图像移动。我很确定这是多个坐标空间的问题,我误解了NSSplitView的坐标是如何工作的,或者与视图层次结构有关。从NSGraphicsContext上的文档中,setPatternPhase:方法中说:“例如,将pattern phase设置为(2,3)会将图案单元平铺的起点移动到默认用户空间中的点(2,3)。”默认用户空间是否与我的自定义视图的边界相对应,或者可能是我正在基于右侧视图的坐标集创建点,并且setPatternPhase在spitview的整个宽度(包括左半部分)上实现它

如果您能提供任何建议/建议/帮助,我们将不胜感激


编辑:我上传了一份项目的副本,这样你就可以看到它的行为:

你需要根据视图在窗口中的位置调整阶段。我在
NSView
上使用此类别:

@implementation NSView (RKAdditions)
- (void)rk_drawPatternImage:(NSColor*)patternColor inRect:(NSRect)rect
{
    [self rk_drawPatternImage:patternColor inBezierPath:[NSBezierPath bezierPathWithRect:rect]];
}


- (void)rk_drawPatternImage:(NSColor*)patternColor inBezierPath:(NSBezierPath*)path
{
    [NSGraphicsContext saveGraphicsState];

    CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]);
    CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]);
    [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)];

    [patternColor set];
    [path fill];
    [NSGraphicsContext restoreGraphicsState];
}

@end
在本例中,您需要修改
-drawRect:
如下所示:

-(void) drawRect: (NSRect)dirtyRect
{
    [self rk_drawPatternImage:[self leatherColor] inRect:self.bounds];
}

这很好用。非常感谢您抽出时间发布您的精彩答案。为了清楚起见,setPatternPhase在窗口的坐标系上运行,而不是从中调用它的视图?