2013-11-17 5 views
0

Я использую следующий метод для захвата изображения верхнего уровня моего приложения. На удивление медленнее, поэтому я ищу более быструю альтернативу. Какие-либо предложения? Операторы журнала - это просто фиксировать тайминги.Что такое более эффективный способ захвата экрана в iPad?

+ (UIImage *) imageWithView:(UIView *)view{ 
    DLog(@"imageWityhView started"); 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    DLog(@"1"); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    DLog(@"2"); 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    DLog(@"3"); 
    UIGraphicsEndImageContext(); 
    DLog(@"Returning an image"); 
    return img; 
} 

Результаты:

2013-11-17 11:30:47.196 ... imageWityhView started 
2013-11-17 11:30:47.220 ... 1 
2013-11-17 11:30:52.543 ... 2 
2013-11-17 11:30:52.544 ... 3 
2013-11-17 11:30:52.547 ... Returning an image 

Unsurprisingly, медленный процесс renderInContext:. Отправка в фоновый поток, потому что он медленный, не является вариантом. Процесс инициируется действием пользователя, и результат необходим как можно скорее, чтобы дать обратную связь пользователю. Кажется, что пять секунд - это абсурдное количество времени для чего-то подобного.

В моем приложении захваченное представление может иметь потенциально более 1300 подпунктов. Однако для моего тестирования было всего около 20 или около того. Так что может заставлять его так долго? Вызывается ли какой-либо метод во всех моих подзаголовках? Есть ли эффективная альтернатива захвату всего экрана, который я могу использовать вместо этого?

+0

Вы в порядке с поддержкой только iOS 7? –

+0

Я поддерживаю iOS 7 и 6. У меня нет проблем с внедрением отдельного кода для каждого. –

ответ

1

Вот обновленный метод и результирующие тайминги.

+ (UIImage *) imageWithView:(UIView *)view{ 
    UIImage *img; 
    DLog(@"1"); 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0); 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { 
     DLog(@"2"); 
     [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 
     DLog(@"3"); 
     img = UIGraphicsGetImageFromCurrentImageContext(); 
    } else { 
     [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     img = UIGraphicsGetImageFromCurrentImageContext(); 
    } 
    DLog(@"4"); 
    UIGraphicsEndImageContext(); 
    return img; 
} 

2013-11-17 12:54:03.568 ... 1 
2013-11-17 12:54:03.592 ... 2 
2013-11-17 12:54:03.740 ... 3 
2013-11-17 12:54:03.741 ... 4 

Общее время уменьшено с 5.3 секунды до < 0,2 секунды. Я могу попытаться еще больше сократить время, используя snapshotViewAfterScreenUpdates:, но пока это идеально подходит для меня.

+0

Это помогло мне. благодаря –

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