Gou*_*dsc 2 user-interface cocoa objective-c
我已经四处搜索,但没有找到任何有关此特定问题的信息.我有一个垂直NSSplitView的窗口.在splitview的右视图中,我有一个NSBox对象设置来填充视图的内容.我使用setContentView加载自定义nib:将视图交换到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];
Run Code Online (Sandbox Code Playgroud)
这意味着当视图被重新调整大小时,模式似乎在NSBox的左上角保持不变,这与预期的行为一样(通过splitview移动或窗口本身被调整大小).我已经在一个精简的测试应用程序中实现了这个,只有一个窗口和一个自定义视图,它的行为符合预期.
然而,在我的带有splitview的项目中,它的行为类似于在整个窗口的左上角设置patternPhase而不是在splitview的右半部分的左上角(即它应该通过调整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
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您将修改-drawRect:为如下所示:
-(void) drawRect: (NSRect)dirtyRect
{
[self rk_drawPatternImage:[self leatherColor] inRect:self.bounds];
}
Run Code Online (Sandbox Code Playgroud)