Garip bir şey üzerinde tökezledim. drawRect:
uygulanmadığı sürece UIView
contentScaleFactor
'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:
- (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
Ç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
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. –