Из того, что я прочитал, новый 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];
однако мне все видимое суб-представления, объединенные в одно изображение.
Ха-ха, через эксперименты я только что нашел тот же результат. Это была проблема! Благодарю. –
Только другая странность заключается в том, что drawViewHierarchyInRect на самом деле является хорошим бит SLOWER, чем renderInContext. Я думал, что это должно быть быстрее? Любая идея, почему это не так? –
Может быть, 'afterScreenUpdates: YES' - я считаю, что он заставит его ждать следующего раза, когда будет показано дерево слоев. Изменяется ли скорость, если вы отключите ее? –