2011-05-18 33 views
14

Bu iPhone 4 ve 3GS büyük çalışır: Yuvarlak UIScrollView Performans

scrollView.layer.cornerRadius = 11; 
scrollView.layer.masksToBounds = YES; 

Ama iPhone 3G ve iPod 2 gen dokunun üzerinde

, bu sarsıntılı gerçekten kaydırma yapar. Örneğin, CALayer alt gölgelerinin performansını iyileştirmek için bazı hileler olduğunu biliyorum (örneğin shouldRasterize, YES ve shadowPath özelliğinin ayarlanması), CALayer'in cornerRadius'u için benzer bir şey var mı?

+0

hmm .. benim anlayışım cglayers'ın GPU'da işlenmesidir. Sorunlarınızın kaynağı olabilir. –

+0

Herhangi bir geçici çözüm öneriyor musunuz? Eski cihazların daha yavaş GPU'lara sahip olduğunun farkındayım. Aynı sonuçları elde etmenin bir yolu yok mu, ama CPU kullanıyor? – samvermette

+0

Bence sorun, yuvarlak köşeleri oluşturmak için GPU yerine CPU kullanarak _is_ olmasıdır. Bildiğim kadarıyla eski cihazlarda yuvarlatılmış yuvarlatılmış köşeler elde etmenin tek yolu 'cornerRadius' dan kaçınmak ve bunun yerine 'drawRect:' deki kırpılmış çiziminizi yapmak ya da bir 'UIImage' içine çekmek. –

cevap

7

İçerik, kaydırma görünümünüzün arkasında mı (yuvarlak köşelerin altında gösteriliyor) düz renk mi yoksa statik mi? Eğer öyleyse, “köşe” grafiklerini üst üste yerleştirerek daha iyi bir performans elde edebilmeniz gerekir - merkezlerindeki saydam ve kenarlarınızda (arka plan renginizle veya neyse) opak (kaydırma görünümünüzün köşelerinde). İçeriğiniz üzerinden dört adet 11x11 görüntüyü bir araya getirme maliyeti, kırpmanınkinden önemli ölçüde daha az olacaktır.

+0

Sorunun yorumlarını söylediğim gibi, kaydırma görünümünün arkasındaki içeriğim yalnızca bir görüntü değil, aynı zamanda dinamiktir. Bu yüzden, arka plan resminin her değiştirilmesinde, çalışma zamanında 4 yuvarlak köşe görüntüsünü oluşturmam gerekiyor. CGContextClip() kullanarak CoreGraphics ile bir yolu yok mu? – samvermette

+0

Üzgünüz, tüm yorumları okumuştum. Bildiğim kadarıyla, CALayers köşelerini oluşturmak için Core Graphics kırpmasını kullanıyor. Çalışma zamanında dört köşe görüntüsünü, muhtemelen süper düzenleyicinin '-renderInContext:' yöntemini kullanarak ve sonra parçalarını keserek oluşturmanız gerekebilir. –

2

CALayers'ın bu şekilde kullanımı çok yavaştır (özellikle eski aygıtlarda), oyunlarda kullanmak çok iyi değildir. UIImages veya cocos2d sprite'a geçiş yapabilirsiniz, başka bir seçenek kendi katmanınızı oluşturmaktır. OpenGL ile sınıf, her ne kadar bu kadar basit değil. Umarım bu seçeneklerden biri sizin için çalışır.