Bu sorunun amacını açıklığa kavuşturmak için: Hem alt görünümlerle hem de drawRect kullanarak karmaşık görünümlerin NASIL oluşturulacağını biliyorum. Birini diğerinin üzerinde kullanmanın ne zaman ve neden olduğunu tam olarak anlamaya çalışıyorum.
Ayrıca, bunu çok önceden optimize etmenin ve herhangi bir profil oluşturmadan önce daha zor bir yol yapmanın mantıklı olmadığını anlıyorum. Her iki yöntemde de rahat olduğumu düşünün ve şimdi daha derin bir anlayış istiyorum.
Karışıklıkların çoğu, tablo görünümü kaydırma performansını gerçekten düzgün ve hızlı hale getirmeyi öğrenmekten geliyor. Tabii bu yöntemin orijinal kaynağı iPhone için twitter arkasındaki yazar (eski tweetie). Temelde tablo kaydırma tereyağını pürüzsüz hale getirmek için sırrın alt görünümleri KULLANMAMAK olduğunu, ancak bunun yerine tüm çizimleri tek bir özel uiview'de yapmak olduğunu söylüyor. Esasen, çok sayıda alt görünüm kullanmanın çok fazla ek yükü olduğu ve ana görünümleri üzerinde sürekli olarak yeniden birleştirildiği için oluşturmayı yavaşlattığı görülmektedir.
Adil olmak gerekirse, bu 3GS oldukça yeni bir marka spankin olduğunda yazıldı ve iDevices o zamandan beri çok daha hızlı oldu. Yine bu yöntem olan düzenli önerdi üzerinde interwebs ve başka yerlerde yüksek performanslı tablolar için. Aslında Apple'ın Tablo Örnek Kodunda önerilen bir yöntemdir, çeşitli WWDC videolarında ( iOS Geliştiricileri için Pratik Çizim ) ve birçok iOS programlama kitabında önerilmiştir .
Grafik tasarlamak ve onlar için Temel Grafik kodu oluşturmak için harika görünümlü araçlar bile var .
İlk başta "Core Graphics'in var olmasının bir nedeni var. HIZLI!"
Ama "Mümkün olduğunda Çekirdek Grafikleri Tercih Et" fikrini alır almaz, drawRect'in genellikle bir uygulamadaki zayıf yanıt vermekten sorumlu olduğunu, son derece pahalı bir bellek bilimi olduğunu ve CPU'ya gerçekten vergi verdiğini görmeye başlarım. Temel olarak, " drawRect'i geçersiz kılmaktan kaçınmalıyım " (WWDC 2012 iOS Uygulama Performansı: Grafikler ve Animasyonlar )
Yani sanırım her şey gibi karmaşık. Belki kendime ve başkalarına drawRect'i kullanmak için Ne Zaman ve Neden?
Core Graphics'i kullanmak için birkaç belirgin durum görüyorum:
- Dinamik verileriniz var (Apple'ın Hisse Senedi Grafiği örneği)
- Basit bir yeniden boyutlandırılabilir resim ile yürütülemeyen esnek bir kullanıcı arayüzü öğeniz var
- Oluşturulduktan sonra birden çok yerde kullanılan dinamik bir grafik oluşturuyorsunuz
Çekirdek Grafiklerden kaçınmak için durumlar görüyorum:
- Görünümünüzün özelliklerinin ayrı olarak canlandırılması gerekir
- Göreceli olarak küçük bir görünüm hiyerarşiniz var, bu nedenle CG kullanarak algılanan ekstra çabalar kazanmaya değmez
- Her şeyi yeniden çizmeden görünümün parçalarını güncellemek istiyorsunuz
- Üst görünüm boyutu değiştiğinde alt görünümlerinizin düzeninin güncellenmesi gerekir
Bu yüzden bilginizi verin. Hangi durumlarda drawRect / Core Graphics (alt görünümlerle de gerçekleştirilebilir) için ulaşırsınız? Sizi bu karara götüren faktörler nelerdir? Düzgün bir tablo hücresi kaydırması için özel bir görünümde çizim nasıl yapılır / neden önerilir, ancak Apple genel olarak performans nedenleriyle drawRect'e karşı tavsiyede bulunur? Basit arka plan resimleri ne olacak (yeniden boyutlandırılabilir bir png resmi kullanarak CG ile oluşturduğunuzda)?
Değerli uygulamalar yapmak için bu konunun derinlemesine anlaşılması gerekmeyebilir, ancak nedenlerini açıklayamadan teknikler arasında seçim yapmayı sevmiyorum. Beynim bana kızıyor.
Soru Güncelleme
Herkese bilgi için teşekkürler. Burada bazı açıklayıcı sorular:
- Çekirdek grafiklerle bir şeyler çiziyorsanız, ancak UIImageViews ve önceden oluşturulmuş bir png ile aynı şeyi başarabiliyorsanız, her zaman bu rotaya gitmeli misiniz?
- Benzer bir soru: Özellikle böyle badass araçlarıyla , çekirdek grafiklerde arayüz öğelerini ne zaman çizmeyi düşünmelisiniz? (Muhtemelen öğenizin görüntüsü değişken olduğunda. Örneğin 20 farklı renk varyasyonuna sahip bir düğme. Başka durumlar var mı?)
- Aşağıdaki cevabımdaki anlayışım göz önüne alındığında, bir tablo hücresi için aynı performans kazanımları, karmaşık UIView oluşturucunuzun kendisinden sonra hücrenizin bir anlık görüntü bitmap'ini etkin bir şekilde yakalayarak ve karmaşık görünümünüzü kaydırırken ve gizlerken göstererek elde edilebilir mi? Açıkçası bazı parçalar üzerinde çalışılmalıdır. Sadece ilginç bir düşünce vardı.