gpt4 book ai didi

cocoa - NSScrollView 内的图像绘制在其他 View 之上

转载 作者:行者123 更新时间:2023-12-03 16:44:30 24 4
gpt4 key购买 nike

我有一个自定义 NSView,位于 NSScrollView 内那是在NSSplitView中。自定义 View 使用以下绘图代码:

- (void)drawRect:(NSRect)dirtyRect {
NSGraphicsContext *ctx = [NSGraphicsContext currentContext];
[ctx saveGraphicsState];

// Rounded Rect
NSRect rect = [self bounds];
NSRect pathRect = NSMakeRect(rect.origin.x + 3, rect.origin.y + 6, rect.size.width - 6, rect.size.height - 6);
NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:pathRect cornerRadius:kDefaultCornerRadius];

// Shadow
[NSShadow setShadowWithColor:[NSColor colorWithCalibratedWhite:0 alpha:0.66]
blurRadius:4.0
offset:NSMakeSize(0, -3)];
[[NSColor colorWithCalibratedWhite:0.196 alpha:1.0] set];
[path fill];
[NSShadow clearShadow];


// Background Gradient
NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:[UAColor darkBlackColor] endingColor:[UAColor lightBlackColor]];
[gradient drawInBezierPath:path angle:90.0];
[gradient release];


// Image
[path setClip];
NSRect imageRect = NSMakeRect(pathRect.origin.x, pathRect.origin.y, pathRect.size.height * kLargeImageRatio, pathRect.size.height);
[self.image drawInRect:imageRect
fromRect:NSZeroRect
operation:NSCompositeSourceAtop
fraction:1.0];

[ctx restoreGraphicsState];

[super drawRect:dirtyRect];
}

我尝试过各种不同类型的operation但图像仍然绘制在 NSSplitView 的另一半之上像这样:

enter image description here

...而不是在 NSScrollView 下绘制。我认为这与绘制所有内容有关,而不是 dirtyRect仅,但我不知道如何编辑图像绘制代码以仅绘制位于 dirtyRect 中的部分。 我怎样才能阻止它在顶部绘制,或者只为这个 NSImage 绘制脏矩形?

最佳答案

我终于明白了。我还不知道它是否是最佳的,但我会在进行性能测试时找到答案。我只需使用 NSIntersectionRect 找出图像矩形和脏矩形的交集,然后找出要为 drawInRect 绘制的 NSImage 的哪个子部分: fromRect:operation:fraction: 调用。

这是重要的部分:

    NSRect imageRect = NSMakeRect(pathRect.origin.x, pathRect.origin.y, pathRect.size.height * kLargeImageRatio, pathRect.size.height);
[self.image setSize:imageRect.size];

NSRect intersectionRect = NSIntersectionRect(dirtyRect, imageRect);
NSRect fromRect = NSMakeRect(intersectionRect.origin.x - imageRect.origin.x,
intersectionRect.origin.y - imageRect.origin.y,
intersectionRect.size.width,
intersectionRect.size.height);
[self.image drawInRect:intersectionRect
fromRect:fromRect
operation:NSCompositeSourceOver
fraction:1.0];

关于cocoa - NSScrollView 内的图像绘制在其他 View 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com