8
ile Çizim sorunları

Her şeyden önce, iPhone çevrimiçi belgelerini, bir katman oluşturma konusunda çeşitli yollar söz konusu olduğunda çok net bir şekilde anlaşılmayacak şekilde buluyorum. Bunun jütünü alıyorum ama hangi yöntemleri kullanacağımı ve katmanın bir alt katman olarak eklenmesini gerektirmediği net değil. [Image drawAtPoint:] yanı sıraCALayer

Projem beni üzerinden bir UIView onları çizim basitçe görüntüleri yükleme ve ile trivially başladı [image drawInRect:]. Bunlar mevcut grafik bağlamını kullanarak iyi çalışır.

O zaman bugün bu katmanları kullanma fikrini okudum, böylece çeşitli resimlerimi (örtülü olarak) canlandıracağım teori bir esinti olacak!

Kayıt için, belgelerin CALayer alt sınıfının gereksiz olduğunu söylediğini biliyorum, ancak bunu yaptım. Şimdi, bir tabaka oluşturmanın farklı yolları hakkında inanılmaz derecede kafam karışık.

  • drawLayer
  • displayLayer
  • ekran
  • drawInContext bu yöntemlerin hepsi için Şimdi

, bu katmanın çerçeve boyutunu ayarlamak için gerekli olan? Görünüm katmanına katman eklemek gerekli mi?

Görünür sonuçları veren tek yöntem, drawinContext yöntemidir. Ancak, örtülü bir animasyon uygularsam (ör. Image.opacity = 0) hiçbir şey olmuyor, bu da katmanımın düzgün şekilde kurulmadığına inanmamı sağlıyor.

Bazıları lütfen bu kargaşaya geri getiriniz.

cevap

18
Çekirdek Animasyon, bu tür bir şeyi önemsiz kılar. Brad'in önerisi doğru. Alt satırda, bu yöntemlerden hiçbirine katman katmanı gerekmiyor.

  • ile içeriği özelliğini ayarlayın: Amacıyla Aşağıdaki emin yaptık yapmak, işlemek için bir katman neden

    [imageLayer setContents:(id)[[UIImage [email protected]"image.png"] CGImage]];

  • boyutuna katmanın sınırlarını ayarlama İstediğiniz.

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • görünümünde görüntülemek için tabakanın pozisyonu (x, y konum) ayarlayın. Varsayılan anchorPoint, katmanın merkezidir. Bu kod, katmanı görüşünüzde ortalar.

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • görünümünüzün katmana katman ekleyin:

    [[[self view] layer] addSublayer:imageLayer];

arada, eğer isterseniz, size -setFrame arayarak bir yöntemde hem sınırları ve konumunu ayarlayabilirsiniz :. İki aramayı kendim için daha okunaklı hisseder gibi kullanmayı tercih ederim, ama bu kendi tercihinize bağlı. Katmanın konumunu ve konumunu veya çerçevesini ayarlamazsanız, katman oluşturmaz.

Tercih ederseniz, yolları, şekilleri (bkz. CAShaperLayer) veya ek resimler çeken ve bunları resim katmanınızın alt katmanları olarak ek katmanları oluşturarak veya üst katmanınızın alt katmanları olarak ekleyerek, katmanlar oluşturarak drawInContext kullanmaktan kaçınabilirsiniz. ve onlara görüntü katmanınızın önünde görüntülenmesine neden olan bir zPosition verin.

Şimdi, opaklığı canlandırmak istiyorsanız, örtülü animasyonu yalnızca katman özelliğini tam olarak anlattığınız şekilde ayarlayabilirsiniz, ör. [imageLayer setOpacity: 0.0f]; Bu, katmanı ve tüm alt katmanlarını 0,25 saniyeden fazla azaltacaktır.

Sadece bazı ek düşünceler.

Saygılarımızla.

2

Çeşitli katmanlarınızın yapmasını istediğiniz her şey bir görüntüyü görüntülüyorsa, bunları alt sınıflara ayırmanız gerekmez. Her katmanın contents özelliğine bir görüntü (CGImageRef formunda) ayarlayabilmeniz gerekir. Katman daha sonra bu görüntünün çizimini ele alacaktır. Bir UIImage'ın Core Graphics görüntü gösterimini, CGImage salt okunur özelliğini kullanarak edinebilirsiniz.

Gerçi, yaklaşık -drawInContext: bir CALayer alt sınıf içinde daha özel çizim kodu koymak için doğru yer olan doğrudur. CALayer alt sınıflandırma olmadan, bir temsilci, katmanın çizim davranışını -drawLayer:inContext: temsilci yöntemiyle değiştirebilirsiniz.

Bu, tüm Apple'ın Core Animation Programming Guide ait "Providing Layer Content" bölümünde ayrıntılı olarak açıklanmıştır.

+0

Yaptığım şey alt sınıftır (nesnelerim karmaşık olduğu için) ve temsilci kendisi tarafından ayarlıyorum. Yani temelde displayLayer kullanıyorum. Tek yapmam gereken katmanın setNeedsDisplay olduğunu çağırmak. Yani şimdi soru hala drawInContext ve drawLayer: inContext kullanımı üzerinde kalır. Bunlar manuel olarak mı adlandırılıyor yoksa dahili olarak SetNeedsDisplay üzerinden mi çağrılıyor? Sadece şimdi merak ediyorum. – AlvinfromDiaspar

+0

İşte daha doğru bir takip sorusu: Şimdi drawLayer: (CALayer *) katmanını kullanarak bir katman oluşturabilirim. Ancak, görüntüyü güncellemek istiyorsam, katmandaki bir animasyon karesi, katmandaki içeriği güncellenmiş bir görüntü * ile ayarlarsam, ekran üzerinde kaybolur. Katmanı kaldırmam ve ardından oluşturup, render ağacına yeniden eklemem gerekir mi? Bu durumda, bu darbeler! – AlvinfromDiaspar

+0

İlk sorunuz için: drawInContext: asla doğrudan çağrılmamalı, ancak setNeedsDisplay tarafından dolaylı olarak tetiklenir. Yöntemi geçersiz kılmadıysanız, içeriğin -drawLayer ile görüntülenmesine yardımcı olmak için temsilci çağırdığını düşünüyorum: inContext: –

İlgili konular