2012-02-24 2 views
1

У меня есть вид с определенным цветом фона. Я маскирую этот вид следующим кодом:ios: Снимок экрана не отображается Маска Layer

UIView *colorableView = [[UIView* alloc] init]; 
colorableView.backgroundColor = someColor; 

CALayer *maskLayer = [CALayer layer]; 
maskLayer.contents = (id)[UIImage imageNamed:maskImageName].CGImage; 

colorableView.layer.mask = maskLayer; 

Хорошо, все хорошо работает там. Вид замаскирован, поэтому некоторые части прозрачны. Теперь я сделать скриншот этой точки зрения:

CGRect frame = colorableView.frame; 

UIGraphicsBeginImageContext(frame.size); 

CGContextRef c = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(someUninterestingCodeToGetACorrectPosition); 

[self.view.layer renderInContext:c]; 
UIImage *screenShotImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return screenShotImage; 

Взятие скриншота работы (на самом деле я показываю некоторые другие вещи выше точки зрения тоже, и именно она отображается на скриншоте, а), но так или иначе, маска не распознается , То, что я получаю, это скриншот полностью цветного вида (прямоугольник) без маски, скрывающей некоторые его части.

Я думаю, что'UIGraphicsGetImageFromCurrentImageContext() `не работает с слоями маски, так что я могу с этим поделать? Мне нужно, чтобы UIImage отображал скриншот в почте.

спасибо заранее

ответ

1

Один из способов исправить это может быть, чтобы использовать функции Quartz клипа вида (CGContextClip, я не помню точно, вам придется копать немного в документацию). Надеюсь, это поможет

+0

Хорошо, я использую'CGContextClipToMask (контекст, rect, maskImage) 'внутри метода drawRect, теперь и он работает для скриншота. Я делаю это только для скриншота, потому что вы не можете анимировать цвета (которые я иногда делаю) при переопределении drawRect. Одна вещь, вы знаете, как получить маску с более высоким разрешением, потому что я думаю, что размер прямоугольника ограничивает разрешение маски. Поскольку исходный прямоугольник довольно мал, но значок чаще масштабируется, и когда я снимаю снимок экрана, разрешение маски намного ниже разрешения маски моего исходного метода маскировки. – JayAr

+0

Возможно, потому что вы находитесь на экране сетчатки? Если это так, вы получаете свойство масштаба [[UIScreen mainScreen]] (не совсем уверенно в синтаксисе), а затем вы умножаете свой размер прямоугольника на это значение. – Ganzolo

+0

Я работаю над Ipad2, поэтому нет изображения сетчатки и свойства шкалы. 1. Если я сделаю оригинальное представление очень большим в Interface Builder, то разрешение маски будет хорошим. Но первоначальный вид такой же большой, как иконка, и масштабы становятся более крупными в какое-то время. Затем я делаю скриншот и потому, что исходный прямоугольник был маленьким, разрешение низкое. Думаю, я открываю для этого еще один вопрос. – JayAr