2012-02-28 19 views
7

Garip bir şey üzerinde tökezledim. drawRect: uygulanmadığı sürece UIViewcontentScaleFactor'un Retina aygıtlarında bile 1 olduğu anlaşılıyor. aşağıdaki yazdıran bir Retina cihazındaUIView'nin contentScaleFactor uygulaması drawRect uygulamasına bağlıdır:?

@interface MyView : UIView 
@end 

@implementation MyView 

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame: frame]; 
    if (self) { 
     NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale); 
    } 
    return self; 
} 

- (void) didMoveToWindow 
{ 
    if (self.window) 
     NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale); 
} 

@end 

: Bu kodu düşünün

-[MyView initWithFrame:] 1 1 2 
-[MyView didMoveToWindow] 1 1 2 

böyle drawRect: boş bir uygulama eklerseniz:

beklendiği gibi çalışır
- (void) drawRect: (CGRect) rect 
{ 
} 

:

-[MyView initWithFrame:] 2 2 2 
-[MyView didMoveToWindow] 2 2 2 

Görünümün herhangi bir görünüm hiyerarşisinde olup olmadığı ve ne tür bir ekranda görüntülendiğinin önemi yok gibi görünüyor. Önemli olan tek şey, görünüm drawRect:'u uygularsa veya gerçekleştirmezse.

Bu bir hata mı yoksa özellik mi? Ben o

- (void) didMoveToWindow 
{ 
    if (self.window) 
     self.contentScaleFactor = self.window.screen.scale; 
} 

ancak varsayılan davranış hala rahatsız etmez beni düzeltmek için aşağıdaki didMoveToWindow değişebileceğini biliyoruz.

Hiçbir şey yapmazsam neden contentScaleFactor'a ihtiyacım olduğunu sorabilirsiniz. Bunun nedeni, hazır bir görüntüye self.layer.contents'u ayarlamam ve daha sonra görüntüyü contentStretch ile genişletmek. Ancak, @2x görüntüsü kullanılsa bile görüntü contentScaleFactor doğru ayarlanmadığı sürece Retina aygıtlarında düzgün şekilde gerilmez. Kesin olmak gerekirse, bir @2x görüntü kullanılmadığı sürece doğru olarak çalışır. Bu sanırım bir böcek.

İçgörünüzü, bu şekilde neden contentScaleFactor davranıyor? Yalnızca iOS 5'e özgü mi? Eğer drawRect: geçersiz yoksa

cevap

10

Tahminen, sonra UIKit o hemen sonra geçersiz olarak 1 bir içerik ölçeğine sahiptir tabakasına sahip olmak (muhtemelen) hızlı davayı alır böylece bir UIView şey çizmek olmadığını bilir drawRect: Bununla birlikte, eğer isterseniz, içine girebileceğiniz doğru içerik ölçeğine sahip bir katman ayarlamanız gerektiğini biliyor. drawRect:'da hiçbir şey yapmadığınızı bilmiyor, ancak daha önce olduğu gibi aynı varsayımı yapamazsınız. Özel bir drawRect uygulamak görünümler için

: docs dile getirilmektedir Aslında

tüm yöntem ve pencereli ilişkilidir, bu özellik için varsayılan değer ilişkili ölçek faktörüdür şu anda görünümü görüntüleyen ekran ile.

Neden sadece drawRect:'u geçersiz kılmıyorsunuz? Ya da muhtemelen şu anda yaptığınız şeyden uzaklaşıp, drawRect: bir saplama olabilir. Dokümanların söylediklerine göre, çalışmaya devam edeceğini ve doğru davranacağını varsaymak kesinlikle mantıklıdır.

+0

Çok teşekkürler! Özünde, ben de öyle düşündüm, ama "özel bir' drawRect: 'yöntemini uygulayan görünümler ve ** bir pencere ile ilişkilendirilmişlerdir ** (vurgu benim), kararın yalnızca penceresi. Gördüğünüz gibi, göz ardı edilen bir pencere ile ilişki var. Belki sadece bir dokümantasyon hatası. 'DrawRect:' çiziminde olduğu gibi, görüntü çok büyük olduğu için bundan kaçınıyorum ve bir düzine var, gerdiğim görüntü 31x31 piksel. Temel olarak, bellek ayak izini olabildiğince düşük tutmaya çalışıyorum. – Costique

+0

Teşekkürler. Tüm çizimimi özel bir CALayer'de yapıyordum ve içerikScale 1'i her zaman sıfırlıyordu. Şimdi retina keskin görünüyor. –

0

Çekirdek Grafikler gibi yerel çizim teknolojileri, geçerli ölçek faktörünü sizin için hesaba katar. Örneğin, görüşlerinizden biri bir drawRect: yöntemini uygularsa, UIKit bu görünümün ölçek faktörünü otomatik olarak ekranın ölçek faktörüne ayarlar. Ek olarak, UIKit, çizimin ölçek faktörünü hesaba katmak için çizim sırasında kullanılan herhangi bir grafik bağlamının mevcut dönüşüm matrisini otomatik olarak değiştirir. Bu nedenle, drawRect: yönteminizde çizdiğiniz herhangi bir içerik, alttaki cihazın ekranı için uygun şekilde ölçeklenir.

İlgili konular