"renderInContext:" и CATransform3D - PullRequest
       31

"renderInContext:" и CATransform3D

4 голосов
/ 02 марта 2012

У меня есть представление, в котором есть многократные представления, и представление изображения (также называемое «потоком обложек») в этом тоже ... И мне нужно сделать снимок экрана программно!

Поскольку документация говоритчто renderInContext: не будет отображать 3D-анимации:

"Важно. Реализация этого метода в Mac OS X v10.5 не поддерживает всю композиционную модель базовой анимации. Слои QCCompositionLayer, CAOpenGLLayer и QTMovieLayer не отображаютсяКроме того, слои, использующие трехмерные преобразования, не отображаются, а также слои, которые задают backgroundFilters, фильтры, compositingFilter или значения маски. В будущих версиях Mac OS X может быть добавлена ​​поддержка для визуализации этих слоев и свойств. "

source: https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html

Я много искал, и мое «лучшее» решение (совсем не хорошее) - создать собственный CGContext и записать в него все анимации CG.Но я действительно не хочу этого делать, потому что мне нужно будет переписать большую часть моих кодов анимации, и это будет очень дорого для памяти ... Я нашел другие решения (некоторые из которых были непоправимыми), так как использовать openGL или захватывать черезAVSessions, но никто, кто может мне помочь ...

Какие у меня варианты?Кто-нибудь с этой проблемой?

Спасибо за ваше время!

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

У меня это работает с протоколами .... Я реализую протокол во всех UIViews классах, которые делают 3D-преобразования.Поэтому, когда я запрашиваю скриншот, он делает скриншот всех подпредставлений и генерирует один UIImage. Не очень хорошо для большого количества просмотров, но я делаю в нескольких представлениях.

#pragma mark - Protocol implementation 'TDITransitionCustomTransform'

//Conforms to "TDITransitionCustomTransform" protocol, return currrent image view state , by current layer

- (UIImage*)imageForCurrentState {

//Make print

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

[self.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//return printed image

return screenShot;

}

Я думал об этомможет работать сейчас, потому что я делаю этот рендеринг в трансформированном слое представления, который сам себя трансформировал ... И это не сработало, потому что "renderInContext:" не получает слои этого подпредставления, возможно ли это?

Любой, кто интересуется немного большим количеством кода этого решения, может быть найден здесь .на форуме разработчиков Apple.

Это может быть ошибка функции, или она просто не предназначена для этой цели ...

0 голосов
/ 29 октября 2015

Может быть Вы можете использовать Core Graphaic вместо CATransform3DMakeRotation:)

CGAffineTransform flip = CGAffineTransformMakeScale(1.0, -1.0);

, которые получают effet для renderInContext

0 голосов
/ 21 марта 2012

ты на самом деле пробовал это?В настоящее время я работаю над проектом с несколькими 3D-преобразованиями, и когда я пытаюсь программно сделать этот скриншот, он работает просто отлично :) Вот код, который я использую:

-(UIImage *)getScreenshot
{
    CGFloat scale = 1.0;
    if([[UIScreen mainScreen]respondsToSelector:@selector(scale)])
    {        
        CGFloat tmp = [[UIScreen mainScreen]scale];
        if (tmp > 1.5)
        {
            scale = 2.0;    
        }
    }      
    if(scale > 1.5)
    {
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, scale);
    } 
    else
    {
        UIGraphicsBeginImageContext(self.frame.size);
    }    
    //SELF HERE IS A UIVIEW
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];    
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return screenshot;
}
...