2009-06-07 27 views
5

İşte kurulumum: Alt ekleyici eklemek istediğim bir CALAyer var. UILabel'ı kurarak ve UILables katmanını ana katmanıma ekleyerek bu alt katmanları yaratıyorum. Tabii ki bu arka planda gezinen ağır UILabel nesnesini bırakır. Katmanı tüm içeriği ile UIView'den almak ve UIView'den kurtulmak mümkün mü?CALayer'i UIView'den kopyalamak mümkün mü?

UILabel* label; 
[...] 
[mainLayer addSublayer:[label.layer copy]]; 
[label release]; 

Ama UIView serbest zaman, tabakanın içeriği de kaldırılır: Zaten bu çalıştı. Bu mümkün mü yoksa UIView'in katmanı her zaman içeriğinin gösterilmesi için UIView'in kendisine ihtiyaç duyuyor mu? Katmanı, UIView boyalarının olduğu bir tür tuval olarak düşündüm. Sanırım bu varsayımda yanılıyor olabilirim :)

cevap

1

Bu mümkün değildir: bir katman UIView'in bir özelliğidir. Bu nedenle, UIView'i serbest bıraktığınızda, tabakası gider. Katmanı bir tür tuval olarak düşünmek yanlış değildir. Ancak, katman UIView'in ayrılmaz bir parçasıdır.

4

Neden bir katman kopyalayamayacağınızı anlayamıyorum. Gerçek bir katman, UIView'in "ayrılmaz bir parçası" dır. Ama sonunda çeşitli özelliklere sahip başka bir nesne.

Aslında orada denilen CALayer için bir yöntemdir:

- (id)initWithLayer:(id)layer 

Ama katmanın bir kopyasını yapmak için tasarlanmamıştır. (Neden akıl için Apple'ın dokümanlar okuyabilir)

CALayer iki seçeneğiniz vardır, böylece NSCopying uymayan:

  1. Alt sınıf onu ve "copyWithZone:" uygulamak (NSCopying ve uygun)
  2. olursa olsun seçim hangi yolu bir CALayer

bir "kopya" döndürecektir bir yöntem/işlevi yaz, sen sormak zorunda soru şu: hangi özellikleri CALlayer kopyalamak ister misiniz?

Şimdi, az önce içeriğini ve çerçevesini kopyalamak istediğiniz diyelim:

CALayer copyLayer = [CALayer layer]; 

copyLayer.contents = theLayerToBeCopied.contents; 
copyLayer.frame = theLayerToBeCopied.frame; 

return copyLayer; 

Sen geçmesi ve katmanın her özelliğini kopyalamak veya sadece ihtiyacınız olanları kopyası olabilir. CALayer kategorisine girmek için iyi bir yöntem olabilir.

+1

çoğaltmak mümkün olacaktır. UIView, onu serbest bıraktığınız için kaybolursa, neden başlangıçta bu UIView'e bağlı bir katman kullanmanız gerekir? Eğer gerçekten bir katmana ihtiyacınız varsa, UIView'e de ihtiyacınız olduğu mantıklı geliyor.Haentz kesinlikle önerdiğiniz yaklaşımı deneyebilir (ve çalışıp çalışmayacağından emin değilim), fakat bunu daha önce Core Animation kodunda görmedim. Ayrıca, Apple bunu mümkün kılmayı düşünürse, CALayer'i NSCopying ile uyumlu hale getirecekti. Bu yaklaşım işe yarayıp yaramadığını bana bildirin. –

+0

Bir CALayer'ı kopyalamak için görebilmemin tek nedeni, aynı katmanın katlarını ekranda göstermesi gerektiğidir. Bence genellikle ilkini yarattığın gibi birden çok katmanı yaratmaya devam edersin. Yine de, ilkini yok etmeyi amaçlıyorsan neden bir kopyasını çıkaracağını anlamıyorum. Düşüncem, orijinaliyle aynı özelliklere sahip bir katmana ihtiyaç duyduğu kadar "kopya" a ihtiyaç duymamasıydı. Haklısın, muhtemelen problemin kabul edilen çözümü değil, ama nasıl çalıştığını görmek ilginç. –

0

UILabel gerçekten çok karmaşık bir denetim değildir. Bu saldırı hattından vazgeçmenizi ve Quartz'i kullanarak istediğiniz şeyi nasıl çekeceğinizi yeni bir CGImage içine almanızı öneririm. Daha sonra bu diğer şeyler hakkında endişelenmenize gerek kalmadan CALayer'in içerik özelliğine atayabilirsiniz.

0

Ayrıca, UILabel'ı tamamen atlatabilir ve metninizi bir CATextLayer ile oluşturabilirsiniz.

0

kullanım CAReplicatorLayer, tamamen o katmanı bir tabakanın amacı, ilişkili UIView ve onun alt katmanlarını kılmaktır Belki de