Новый API был добавлен после iOS 7, что должно обеспечить эффективный способ получения снимка
snapshotViewAfterScreenUpdates:
визуализирует представление в UIView с неизменяемым content
resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets
: то же самое, но с изменяемыми размерами вставок
drawViewHierarchyInRect:afterScreenUpdates:
: то же самое, если вам нужны все подпредставления нарисованные тоже (например, метки, кнопки ...)
Вы можете использовать UIView
для любого эффекта пользовательского интерфейса или визуализировать изображение, как вы сделали, если вам нужно экспортировать .
Я не знаю, насколько хорошо этот новый метод работает по сравнению с предоставленным вами (хотя я помню инженеров Apple, которые говорили, что этот новый API был более эффективным)
Я не уверен, следует ли мне просто скопировать / вставить с веб-сайта , но я лучше оставлю здесь ответ, а не ссылку. Если кто-нибудь может уточнить в комментариях, я буду очень признателен.
По сути, вам нужно расширить класс WebBrowser.
public class ExtendedWebBrowser : WebBrowser
{
bool renavigating = false;
public string UserAgent { get; set; }
public ExtendedWebBrowser()
{
DocumentCompleted += SetupBrowser;
//this will cause SetupBrowser to run (we need a document object)
Navigate("about:blank");
}
void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
{
DocumentCompleted -= SetupBrowser;
SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
xBrowser.BeforeNavigate2 += BeforeNavigate;
DocumentCompleted += PageLoaded;
}
void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}
void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
ref object postData, ref object headers, ref bool cancel)
{
if (!string.IsNullOrEmpty(UserAgent))
{
if (!renavigating)
{
headers += string.Format("User-Agent: {0}\r\n", UserAgent);
renavigating = true;
cancel = true;
Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
}
else
{
renavigating = false;
}
}
}
}
Примечание: Чтобы использовать метод выше, вам нужно добавить ссылку COM на «Microsoft Internet Элементы управления ».
Он также упоминает ваш подход и заявляет, что элемент управления WebBrowser, похоже, кэширует эту строку пользовательского агента, поэтому он не изменит пользовательский агент без перезапуска процесса.