IKImageBrowserView с фоном и wantLayer
В моем приложении я использую IKImageBrowserView с фоном. Если WantLayer НЕТ - все хорошо, и 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);
Спасибо
2 ответа
Я столкнулся с этой проблемой искаженного фонового изображения, и оказалось, что я неправильно настроил CALayer для фона. Я подозреваю, что вы неправильно понимаете причину, по которой вы хотите установить значение wantLayer в значение false, потому что при его установке слой не сразу перерисовывает новые установленные вами слои.
Я пришел к такому выводу, как будто я правильно настроил слой, а затем установил значение falseLayer false непосредственно перед установкой неверного CALayer в следующей строке кода. Сначала я вижу правильное, неискаженное изображение и только при прокрутке (и перерисовке) я вижу глючные эффекты на вашем скриншоте. Однако если в той же точке кода установить значение wantLayer в значение true, я сразу вижу некорректную графику при загрузке браузера без необходимости перерисовки.
Вы можете переместить ложное утверждение wantLayer дальше по вашему коду, чтобы найти строку, которая его нарушает, и где-то слой будет сброшен / обновлен где-то.
Я пытался использовать IKImageView несколько недель назад и столкнулся с рядом проблем. Это хороший класс, но, похоже, он давно не обновлялся. Я не поддерживаю экран Retina и, как вы указываете, сходит с ума, когда вы добавляете слой.
Я хотел сделать пользовательский рисунок с помощью CALayer поверх изображения. Первым делом я попытался добавить слой к изображению, что вызвало у меня проблемы. Решение, которое я выбрал, заключается в том, чтобы добавить пользовательское подпредставление NSView к представлению изображения, добавить ограничения автоматического макета, чтобы он всегда имел одинаковый размер, а затем добавить представление размещения слоя к подпредставлению. Это сработало нормально, поэтому перенесите код рисования в пользовательское подпредставление, и оно должно работать.
IKImageView
LayerHostingView (<--- add CALayer here)