Тени CALayer слишком сильно смещаются с помощью renderInContext в меньший контекст - PullRequest
0 голосов
/ 26 августа 2011

У меня есть UIView, с UIViews в качестве подпредставлений.Каждый из этих вложенных UIViews рисует изображение, используя drawRect, и может иметь тень, используя CALayer shadowOffset, shadowRadius, shadowOpacity.

Все это прекрасно работает, но я делаю миниатюрное изображение верхнего UIView с помощью renderInContext.Все тени отображаются на большом расстоянии от sub-UIView.

Это было бы правильно, из-за смещения тени, но мне нужно, чтобы смещение тени было меньше (или ноль) во время метода renderInContext, потому чтоконтекст миниатюр намного меньше контекста UIView.

Я мог бы визуализироватьInContext в большой контекст, а затем масштабировать, но Instruments показывает, что использование контекстной памяти в больших контекстах за это короткое время увеличивается на 3-4 Мб, а памяти мало..

Есть ли другой способ достичь этого?Или быстрая альтернатива методу renderInContext для захвата миниатюр иерархии UIView?


Редактировать: Вместо использования CALayer shadowOffset я попытался использовать CGContextSetShadowWithColor внутри drawRect: - это работает, нотени обрезаются, хотя для clipsToBounds установлено значение NO.Любые идеи на эту альтернативу?

Спасибо.

1 Ответ

1 голос
/ 27 августа 2011

Этот ответ исправляет это: Получение измененного размера скриншота из UIView

Я использовал:

 thumbnailSize = CGSizeMake(PAGE_THUMB_HEIGHT, PAGE_THUMB_WIDTH);
 UIGraphicsBeginImageContext(thumbnailSize);
 CGContextScaleCTM(UIGraphicsGetCurrentContext(), thumbnailSize.width/viewToCapture.bounds.size.width, thumbnailSize.height/viewToCapture.bounds.size.height);
 [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *flattenedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

, но UIGraphicsBeginImageContextWithOptions это исправляет:

CGSize thumbnailSize = CGSizeMake(PAGE_THUMB_WIDTH, PAGE_THUMB_HEIGHT);
CGFloat scaleX =  thumbnailSize.width / viewToCapture.bounds.size.width;
CGFloat scaleY = thumbnailSize.height / viewToCapture.bounds.size.height;
UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, YES, scaleX > scaleY ? scaleY : scaleX);
[viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *flattenedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
...