我到处搜寻,但未发现任何有关此特定问题的信息。我有一个带有垂直NSSplitView的窗口。在splitview的右视图中,我设置了一个NSBox对象来填充视图的内容。我正在使用setContentView:加载自定义笔尖,以将视图交换到splitview右侧的NSBox。在我的自定义视图中,我想用一个NSColor对象填充视图,该对象使用NSImage来图案化背景。所有这些都按预期工作。我正在使用基于本文的代码:http://www.mere-mortal-software.com/blog/details.php?d=2007-01-08将模式的相位设置为左上角:

[[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的项目中,它的行为就像是在整个窗口的左上角而不是splitview的右半部分的左上角设置了patternPhase(即,应随调整splitview的大小而移动)它的行为就像是“显示较大的图像而不是随其移动。我可以肯定这是一个具有多个坐标空间的问题,我误解了NSSplitView的坐标是如何工作的,或者与视图层次结构有关。”关于NSGraphicsContext的文档,在setPatternPhase:方法中说:“例如,将图案相位设置为(2,3)可以将图案单元格平铺的开始移到默认用户空间中的点(2,3)。 “默认用户空间是否将与我的自定义视图的边界相对应,或者是我根据右侧视图的坐标集创建点,而setPatternPhase将该点实现为spitview的整个宽度(包括将左半部分)?

您可以提供的任何建议/建议/帮助将不胜感激。

编辑:我已经上传了项目的副本,所以您可以看到行为:http://dl.dropbox.com/u/6679821/ViewSwitcher.zip

最佳答案

您需要根据视图在窗口中的位置来调整相位。我在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];
}

07-28 01:53
查看更多