2011-01-11 18 views
9

Birisi bir yolu biliyor mu, yoksa bir UIWebView'dan görüntülenen bir UIImage nasıl elde edileceğine dair bir fikir mi var? Yakalama, bir arka plan iş parçacığı üzerinde olmalıdır.Bir arka plan iş parçacığında UIWebView oluşturarak bir UIImage oluşturun - iPhone

Detayı geçeceğim: Her iki saniyede birden fazla UIWebViews görüntüsünü elde etmeye çalışıyorum + - ve ekranda (iPhone'un elbette) göstermeye çalışıyorum. Bir katmanı bir CGContext'e işlemek, CPU kullanan bir iş olduğundan, ana iş parçacığı kullanmak istemiyorum, böylece kullanıcı arabirimini asmamalıyım.

Benim girişimleri defa idi:

  • Ben UIGraphicalContext için WebView katman üzerinde renderInContext kullanmaya çalıştı ama _WebTryThreadLock hata webviews çöktü.

  • Bir CGBitmapContext oluşturmayı denedim ve web görünümünün katmanını oluşturmaya çalıştım, ancak aynı sonucu aldım.

  • O derin kamu özellikleri ve alt katmanlar tüm kopyalanmış CALayer (a Kategori ekleyerek) bir copy yöntemi uygulayan çalıştı. Daha sonra, kopyaladığım katman renderInContext'u denedim. kısmen "doğru" olan bir UIImage aldım - yani, tüm katmanların oluşturulmadığı anlamına gelir, örneğin, yalnızca web sitesi üstbilgisini (veya altbilgiyi veya gövdeyi veya arama çubuğunu veya yalnızca bir kısmını alırdım çerçeveler). UIWebview'in katmanı her çeşit alt sınıf CALayer'dan oluşur, bu yüzden bu yaklaşımın neden işe yaramadığı muhtemelen muhtemeldir. (Ikisi de)
  • Ben CATransaction içinde kCATransactionDisableActions ayar denedik ama bu davranışı değiştirmek için görünmedi.

Vazgeçmeye çok yakınım.

Aranızda bir kurtarıcı var mı?

+0

+1 sert soru –

cevap

4

UIWebView nefret eder ve ben gerçekten bir arka plan iş parçacığına yapılan bir şey yapmadan nefret eder. UIKit tamamen iplik güvenli değildir. Bir grafik içeriğine çizim yapmak (bu, iOS 4'te eklenmiştir), ancak ikincil bir iş parçacığı üzerinde UIView'ler oluşturulmamasıdır.

UIWebView'larınızı ana iş parçacığından mı oluşturuyorsunuz? Paylaşacak bazı kodlarınız var mı? Sorunlarınızın, ikincil bir iş parçacığı üzerinde bir UIWebView'e işlem yapmaya çalıştığınız gerçeğinden kaynaklandığından şüphelenirim. Görünümün içeriğini bir görüntü olarak oluşturmak için çizim işlemi , ana iş parçacığından olabilir, ancak görünümün kendisi oluşturulamaz.

+3

Ana iş parçacığı üzerinde UIWebViews oluşturuyorum. "Nefretler" bölümü hakkında daha fazla katlanamadım;) ve ayrıca bir grafik bağlamına çizim yapmanın mümkün olduğunu kabul ediyorum, ancak maalesef, UIWebView düzeninin belirli koşullarda kilitlenmesi gibi görünüyor. UIWebView'ın kendisi (ana iş parçacığı değil, iOS'un onu işlemek için oluşturduğu), kilitleme ikincil bir iş parçacığı tarafından yapıldığında çıldırmasına neden olur. UIWebView düzeni, CALayer'ın (WebLayer vb.) Birkaç özel API alt sınıfı ile oluşturulmuştur. – Gilbert

+0

Web görüntüleriyle daha önce benzer konular gördüm, bunlar aynı zamanda simülatörle sınırlı olsa da - haklısınız, muhtemelen özel alt sınıflardan biriyle ilgisi var. Üzgünüm daha fazla yardım edemem. – lxt

0

Ben de bunun üzerinde çalışıyorum.

Bir iş parçacığında, web görünümü içerik yüklemeyi tamamlayana kadar bir görünüm hiyerarşisi oluşturuyorum.

Ben oluşturmak webview ben

if ([NSThread isMainThread] == NO) {[self performselectorOnMainThread: @selector(viewDidLoad)return;)} 

yapıyor denedim bir UIViewController'ın viewdidload-- içindedir Ve Web Görünümü dealloc'ing için aynı yaptık.

Ama bu işe yaramadı ..Ben sadece UIWebView istisnalar önlemek için bulunduğumuz UNTIL autorelease havuzuna çarptı ...

neden anlamaya enstrümanlar kullanıyorum.

İşte benim saldırı stratejim ... Ana iş parçacığı üzerinde render işlemini bir ekran görünümü ile gerçekleştireceğim, bunları yönetmek için bir çeşit kuyruk çalıştıran ayrı bir iş parçacığına sahip olacağım. UI gecikmesi hakkında endişeliyim, bu yüzden oldukça verimli olmalı.

+0

Evet, işte bu ... Ayrı bir iş parçacığı üzerinde oluşturma oluşturmak, bir alt iş parçacığı üzerinde yükleme durumunu sorgulamak ve sonra hazır olduğunda ana iş parçacığı oluşturmak için seçicileri yapın. – user438350

+2

Temelde şu anki çözümüm. Ama bu iyi bir şey değil çünkü bu yüzden çok fazla UI gecikme var (ve ana iş parçacığı üzerinde yaptığım tek şey gerçek çekirdek işleme sürecidir). – Gilbert

İlgili konular