2014-01-23 44 views
2

在我的應用程序中,我使用IKImageBrowserView與背景。如果wantLayer沒有 - 所有罰款和IKImageBrowserView看起來不錯。但是,如果我啓用了wantsLayer(在父視圖中)IKImageBrowserView中的背景已損壞。 (對不起英文不是我的母語,我找不到正確的詞)。IKImageBrowserView與背景和wantsLayer

如果我理解正確,在這個片段的問題。但我看不到在哪裏。

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

感謝

回答

0

我試圖用IKImageView幾個星期前,跑了一個號碼,如果問題。這是一個很不錯的課程,但似乎很久沒有更新過了。我不支持視網膜屏幕,因爲當你添加圖層時,你指出了瘋狂。

我想用CALayer在圖像頂部做一些自定義繪圖。我嘗試的第一件事是在圖片視圖中添加一個圖層,這給了我一些問題。我選擇的解決方案想要將自定義NSView子視圖添加到圖像視圖中,添加自動佈局約束以使其大小始終相同,然後將圖層託管視圖添加到子視圖。這工作得很好,所以移動你的繪圖代碼到一個自定義的子視圖,它應該工作。

IKImageView 
    LayerHostingView (<--- add CALayer here) 
+0

有趣但它現在幫助我的情況.. – user3229853

0

我跑在這個扭曲的背景圖片的問題,以及和它原來是,我已經建立的CALayer爲背景不正確。我懷疑你誤解了把wantsLayer設置爲false的原因,因爲當它被設置時,圖層不會立即重新繪製你設置的新圖層。

我得出了這個結論,好像我正確地設置了圖層,然後在下一行代碼中設置好CALayer之前立即設置了wantsLayer false我首先看到正確的,沒有失真的圖像,並且只有當我滾動時(並重繪)我能看到截圖中的越野車效果嗎?但是,如果我在代碼中的相同位置設置wantsLayer爲true,那麼在瀏覽器加載時立即看到有問題的圖形,而不必先重繪。

您可以將wantLayer false語句進一步移到您的代碼的下方,找到破壞它的那一行,它將是圖層重置/更新的地方。