2009-07-08 2 views
4

Я получаю «снимок» UITextView как CGImage, но проблема в том, что содержимое UITextView очень длинное (около ~ 110k contentSize.height), и когда я визуализирую слой UITextView в контекст памяти использование становится ~ 130 МБ, что приводит к сбою приложения при запуске на устройстве.Как я могу получить только частичный прямоугольник из CALayer?

Вот код. viewref - это экземпляр UITextView.

UIGraphicsBeginImageContext(self.viewref.contentSize); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 

//render the text 
CALayer *tLayer = self.viewref.layer; 
[tLayer renderInContext:ctx]; 

//get the "snapshot" 
CGImageRef imageRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; 
UIGraphicsEndImageContext(); 

Итак, могу ли я визуализировать только частичный слой UITextView для контекста изображения?

ответ

0

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

Как именно вы создаете моментальный снимок CGImage?

3

Попробуйте что-то вроде следующий: (непроверенное, но вы получите суть)

CGSize contentSize = self.viewref.contentSize; 
CGFloat verticalChunkHeight = 1024.0; 
CGFloat verticalOffset = 0.0; 

while (verticalOffset < contentSize.height) 
{ 
    CGFloat height = fmin(verticalChunkHeight, contentSize.height - verticalOffset); 

    UIGraphicsBeginImageContext(CGSizeMake(contentSize.width, height)); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGContextTranslateCTM(ctx, 0.0, -verticalOffset); 
    CGContentClipToRect(ctx, CGRectMake(0.0, verticalOffset, contentSize.width, height)); 

    CALayer *tLayer = self.viewref.layer; 
    [tLayer renderInContext:ctx]; 

    CGImageRef imageRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; 

    // do something with imageRef 

    UIGraphicsEndImageContext(); 
} 
+0

CGContentClipToRect не найден ни в одном заголовках ... вы имели в виду CGContextClipToRect? – hfossli

+0

Почему это необходимо для перевода? Сбрасывает ли CGContextClipToRect исходные значения на прямой? – hfossli

+0

Да, я имел в виду CGContextClipToRect. Я не могу вспомнить (от 3 лет назад!), Почему я положил перевод, - возможно, это было частью попытки перевернуть координатное пространство, но если так, я забыл масштабировать на -1 по вертикали. Я вижу, что я также пропустил «verticalOffset + = verticalChunkHeight;» в конце цикла while. NB предостережение перед блоком кода! – hatfinch