2

在我的应用程序中,我使用带有背景的 IKImageBrowserView。如果想要Layer NO - 一切都很好,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);

有问题的图片

图像没有问题

谢谢

4

2 回答 2

0

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

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

IKImageView
    LayerHostingView (<--- add CALayer here)
于 2014-01-24T13:23:32.540 回答
0

我也遇到了这个背景图像失真的问题,结果证明我为背景设置了 CALayer 不正确。我怀疑您误解了将 WantLayer 设置为 false 的原因,因为设置该图层时,该图层不会立即重绘您设置的新图层。

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

您可以将 wantLayer false 语句进一步向下移动代码以找到破坏它的行,它将是图层在某处重置/更新的位置。

于 2015-03-10T22:50:36.670 回答