2012-07-14 14 views
5

setNeedsDisplay ile uğraşıyorum. Göründüğü görünüm için drawRect: çağrılarını tetiklemesi gerekiyordu ve hiyerarşinin altında olması, görünümün sınırları dahilinde ise, ancak durumun böyle olmadığını bulmuyorum. İşte benim kurulumum:setNeedsDisplay, alt gösterimlerde beklendiği gibi tetiklenmiyor

Uygulama temsilcisinden, boyutu esas olarak tüm ekran emlakını kapsayan bir karesi olan bir görünüm oluşturuyorum. Bu görünüm TrollCalendarView olarak adlandırılır. Pusula tarafından tetiklenen bir rotasyon hariç, TrollCalendarView ile çok fazla şey yoktur.

7 taraflı düzende TrollCalendarView merkezi etrafında düzenlenmiş 2B çekme maddeleri taşımak için PlatformView adı TrollCalendarView 7 subviews vardır. Böylece iPad döndürülürken, bu 7 görünüm, her zaman kardinal yönlere göre yönlendirilecek şekilde döndürülür.

PlatformView altyazılarının her biri Tower adlı 3 alt görünümü içerir. Her kule, drawRect:'da uygulanan 2B çizim nesneleri içerir.

Yani, özetle, ben boş drawRect: ile TrollCalendarView var ve PlatformView ve Platformview subviews - Her drawRect uygulamaları olduğunu> Kulesi. Ayrıca, Tower Platform sınırları içinde yer alır ve Platform TrollCalendarView sınırları içinde yer alır.

TrollCalendarView'da bir kaydırıcı tanıyıcı ekledim. Kaydırma gerçekleştiğinde, bir özellik güncelleştirilir ve ben [self setNeedsDisplay] derim ama hiçbir şey olmuyor gibi görünüyor. Bu görünümlerin her birinde NSLog girişlerini drawRect: yöntemine ekledim ve yalnızca TrollCalendarViewdrawRect: yöntemi çağrıldı. İronik olarak, bu, drawRect yönteminin boş olacağı görünümdür.

Hiçbir xib dosyası yok.

Diğer alt görünümlerde drawRect yönteminin kullanıldığından emin olmak için ne yapmam gerekiyor? Bunu etkileyebilecek tüm nüansları tanımlayan bir yer var mı?

cevap

7

SetNeedsDisplay ile uğraşıyorum. Ben durumun değil, görünümün sınırları

Hayır

içinde ise o bunun altında çağrıldığı için görünümü ve hiyerarşi için drawRect aramaları tetiklemek için sanıyordum. Bu fikri nereden edindin?

-setNeedsDisplay: yalnızca gönderildiği görünüm için geçerlidir. Diğer görünümleri geçersiz kılmanız gerekiyorsa, bunlara -setNeedsDisplay: göndermek için bir kod eklemeniz gerekir. Hepsi bu kadar var.

+0

Bu fikri, bu soruya verilen cevaplardan, yığın akışında benzer sorulara sahibim. Sadece subview setNeedsDisplay örneklerini arayın. Bir kaç tane var. –

+0

Başka bir yol öğrenemediğim sürece bu öneriyi takip edeceğim. En azından testlerimde bulgularımla uyuşuyor. –

+1

Ne yazık ki, çok fazla gürültü ve çok fazla kör-kör-kör. Baktığınız sorular çok az oy var, bu yüzden pek çok insan onları görmedi ya da onları düzeltmek için bir şansı yoktu. Yeni başlıyorsanız, Apple dokümanları çok daha güvenilirdir. –

5

Bu, çerçevede bir optimizasyon olduğunu düşünüyorum; Alt görünümleriniz 'un tekrar çizilmemesine neden olursa, tekrar çizmek gerekirse, bu büyük bir performans iyileştirmesidir. Neredeyse herşeyi anımsatan bir şeyin doğru (hareketli, ölçekleme, vb.) Gerektirmediğini fark edin.Eğer subviews tüm yeniden çizilmesi (ve sadece taşındı) gerektiğini biliyor Eğer

, sonra ana görünümde setNeedsDisplay geçersiz kılmak ve bunu böyle:

-(void) setNeedsDisplay { 
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)]; 
    [super setNeedsDisplay]; 
} 

Bunu test ettik ve bu tüm alt görünümlerin de yeniden çizilmesine neden olur. Eğer altyazılarınızı bir şekilde filtrelerseniz ve sadece 'un aslında yeniden çizilmesi gereken alt görünümlere ve eğer bunları yeniden çizmeniz gerektiğine dair 'un nasıl olduğunu anlayabilmeniz için verim karma puanları kazanacağınızı unutmayın. . :-)

+0

Teşekkürler. Onu deneyeceğim. Benim senaryoda, 7 platform alt görünümlerinin yeniden çizilmesine gerek kalmayacak. Geriye kalan 21 alt raporun tam üçte ikisinin yeniden çizilmesi gerekecek. 21'in hangisinin yeniden çizilmesi gerektiğinin bilinmesi, drawRect'te etkin bir şekilde hesaplanır ve başka yerlerde daha verimli bir şekilde yapılamaz. Sadece merak ediyorum - çerçeve kararımı nasıl veto eder (optimizasyon yorumunuz)? Öyle görünüyor ki setNeedsDisplay ilk etapta sahip olma amacını yener. –

+0

Hayır. Çalışmıyor. Bu sadece alt görünümleri alır. Yeniden gözden geçirilmek üzere bu alt raporların alt görünümlerine ihtiyacım var. SetNeedsDisplay ayarlamam gereken yerde ağaca yürümenin işini yapmaya karar verdim. Yine de öneriniz için teşekkürler. –

İlgili konular