在我的应用程序中,我将IKImageBrowserView与背景一起使用。如果不想要-一切都很好,并且IKImageBrowserView看起来不错。但是,如果我启用了wantLayer(在父视图中),则IKImageBrowserView中的背景已损坏。 (对不起,英语不是我的母语,我找不到正确的词)。

如果我理解正确,则此片段中存在问题。但是我看不到哪里。

NSRect visibleRect = [owner visibleRect];
NSRect bounds = [owner bounds];

CGImageRef image = NULL;
NSString *path = [[NSBundle mainBundle] pathForResource:[@"metal_background.tif" stringByDeletingPathExtension] ofType:[@"metal_background.tif" pathExtension]];
if (!path) {
    return;
}

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path], NULL);
if (!imageSource) {
    return;
}

image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
if (!image) {
    CFRelease(imageSource);
    return;
}

float width = (float) CGImageGetWidth(image);
float height = (float) CGImageGetHeight(image);

//compute coordinates to fill the view
float left, top, right, bottom;

top = bounds.size.height - NSMaxY(visibleRect);
top = fmod(top, height);
top = height - top;

right = NSMaxX(visibleRect);
bottom = -height;

// tile the image and take in account the offset to 'emulate' a scrolling background
for (top = visibleRect.size.height-top; top>bottom; top -= height){
    for(left=0; left<right; left+=width){
        CGContextDrawImage(context, CGRectMake(left, top, width, height), image);
    }
}

CFRelease(imageSource);
CFRelease(image);




Image with problem

Image without problem

谢谢

最佳答案

几周前,我尝试使用IKImageView并在遇到问题时遇到了很多问题。这是一个不错的课程,但是似乎很长一段时间都没有更新。我不支持视网膜屏幕,正如您所指出的,添加图层时会发疯。

我想使用CALayer在图片上方进行一些自定义绘制。我尝试的第一件事是在图像视图中添加一层,这给我带来了问题。我寻求的解决方案是将自定义NSView子视图添加到图像视图,添加自动布局约束以使其始终具有相同的大小,然后将图层托管视图添加到子视图。这工作正常,因此将您的图形代码移动到自定义子视图中,它应该可以工作。

IKImageView
    LayerHostingView (<--- add CALayer here)

关于macos - IKImageBrowserView具有背景和wantLayer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21321402/

10-09 05:15