IKImageBrowserView with background和wantsLayer

时间:2014-01-23 23:22:08

标签: macos cocoa calayer ikimagebrowserview

在我的应用程序中,我使用带背景的IKImageBrowserView。如果wantLayer没有 - 所有罚款和IKImageBrowserView看起来不错。但是,如果我启用了wantsLayer(在父视图中),则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

由于

2 个答案:

答案 0 :(得分:0)

几周前我尝试使用IKImageView,如果出现问题,我会尝试使用IKImageView。这是一个很好的课程,但它似乎没有在很长一段时间内更新。我不支持视网膜屏幕,正如你指出的那样,当你添加图层时会发疯。

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

IKImageView
    LayerHostingView (<--- add CALayer here)

答案 1 :(得分:0)

我也遇到了这个扭曲的背景图像问题,结果证明我已经错误地为背景设置了CALayer。我怀疑你误解了将wantLayer设置为false的原因,因为当设置时,图层不会立即重绘您设置的新图层。

我得出了这个结论,好像我正确设置了图层,然后在下一行代码中设置错误的CALayer之前立即设置了wantLayer false我首先看到了正确的,未失真的图像,只有当我滚动(并且重绘)时在屏幕截图中看到有问题的效果吗?但是,如果我在代码中的同一点设置了wantsLayer,我会在浏览器加载时立即看到错误的图形,而不必先重绘。

您可以在您的代码中进一步移动wantsLayer false语句,以找到打破它的行,它将在某处重置/更新图层。