2013-11-06 5 views
5

Из того, что я прочитал, новый iOS7 drawViewHierarchyInRect должен быть быстрее, чем CALayer. И в соответствии с this и this, она должна быть простой вопрос вызова:DrawViewHierarchyInRect от iOS7 не работает?

[myView drawViewHierarchyInRect:myView.frame afterScreenUpdates:YES]; 

вместо

[myView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

Однако, когда я пытаюсь это, я просто получить чистые изображения. Полный код, который делает захват, где «я» является подклассом UIView,

 // YES = opaque. Ignores alpha channel, so less memory is used. 
     // This method for some reasons renders the 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, self.window.screen.scale); // Still slow. 

    if ([AIMAppDelegate isOniOS7OrNewer]) 
     [self drawViewHierarchyInRect:self.frame afterScreenUpdates:YES]; // Doesn't work! 
    else 
     [self.layer renderInContext:UIGraphicsGetCurrentContext()];  // Works! 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    contentImageView.image = image; // this is empty if done using iOS7's way 

и contentImageView является UIImageView, который добавляется в качестве подвида к себе во время инициализации.

Кроме того, чертеж, который я хочу захватить на изображении, содержится в других под-представлениях, которые также добавляются в качестве подзадача во время инициализации (включая contentImageView).

Любые идеи, почему это происходит при использовании drawViewHierarchyInRect?

* Update *

Я получаю изображение, если я рисую конкретный суб-вид, например:

[contentImageView drawViewHierarchyInRect:contentImageView.frame afterScreenUpdates:YES]; 

или

[self.curvesView drawViewHierarchyInRect:self.curvesView.frame afterScreenUpdates:YES]; 

однако мне все видимое суб-представления, объединенные в одно изображение.

ответ

7

Попробуйте с помощью self.bounds, а не self.frame. Возможно, вы получаете изображение своего вида, визуализированное за пределами созданного вами контекста изображения.

+0

Ха-ха, через эксперименты я только что нашел тот же результат. Это была проблема! Благодарю. –

+0

Только другая странность заключается в том, что drawViewHierarchyInRect на самом деле является хорошим бит SLOWER, чем renderInContext. Я думал, что это должно быть быстрее? Любая идея, почему это не так? –

+0

Может быть, 'afterScreenUpdates: YES' - я считаю, что он заставит его ждать следующего раза, когда будет показано дерево слоев. Изменяется ли скорость, если вы отключите ее? –

Смежные вопросы