Я наткнулся на странную вещь. Похоже, что UIView
contentScaleFactor
всегда равно 1, даже на устройствах Retina, если вы не внедрили drawRect:
. Рассмотрим этот код:
@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
На устройстве Retina он печатает следующее:
-[MyView initWithFrame:] 1 1 2
-[MyView didMoveToWindow] 1 1 2
Если я добавлю пустую реализацию drawRect:
, например:
- (void) drawRect: (CGRect) rect
{
}
работает как положено:
-[MyView initWithFrame:] 2 2 2
-[MyView didMoveToWindow] 2 2 2
Так что, похоже, на самом деле не имеет значения, находится ли представление в какой-либо иерархии представления и на каком экране оно отображается. Единственное, что имеет значение, это то, реализует ли представление drawRect:
или нет.
Это ошибка или особенность? Я знаю, что могу изменить didMoveToWindow
, как показано ниже, чтобы исправить это
- (void) didMoveToWindow
{
if (self.window)
self.contentScaleFactor = self.window.screen.scale;
}
но поведение по умолчанию все еще вызывает у меня проблемы.
Вы можете спросить, зачем мне вообще нужен contentScaleFactor
, если я ничего не рисую. Это потому, что я просто установил self.layer.contents
на готовое изображение, а затем растянул изображение на contentStretch
. Однако изображение на устройствах Retina не растягивается должным образом, если contentScaleFactor
не установлен правильно, даже если используется изображение @2x
. Точнее, он работает правильно , если не используется a @2x
изображение. Это, наверное, ошибка.
Может кто-нибудь поделиться вашим пониманием того, почему contentScaleFactor
ведет себя так? Это специфично только для iOS 5?