Симулятор iPhone Retina имеет неправильное разрешение экрана - PullRequest
3 голосов
/ 23 января 2011

Я пытаюсь написать универсальное приложение. Дисплей должен немного отличаться для разных разрешений экрана. Но когда я кодирую так:

- (void)viewDidLoad {
    SCREEN_WIDTH=[[UIScreen mainScreen] applicationFrame].size.width;
    SCREEN_HEIGHT=[[UIScreen mainScreen] applicationFrame].size.height;
    NSLog(@"w:%f h:%f",SCREEN_WIDTH,SCREEN_HEIGHT);
...
}

Я получаю вывод: w:320.000000 h:480.000000 даже когда симулятор установлен на
Аппаратное обеспечение-> Устройство-> iPhone (Retina)
Кроме того, изображения с таким разрешением отображаются в полноэкранном режиме в симуляторе.
Я понимаю, что должен получить w:640.000000 h:960.000000.
Так ли это для кого-то еще? И есть идеи, почему / как это исправить? Смотрите соответствующую ветку: здесь

Ответы [ 3 ]

5 голосов
/ 23 января 2011

UIScreen всегда будет сообщать о разрешении устройства Retina Display как о разрешении устройства Retina Display.Это позволяет старому коду прозрачно работать на таких экранах.Однако UIScreen предоставляет свойство scale, которое в сочетании с границами экрана можно использовать для определения физического разрешения пикселя устройства:

CGSize PhysicalPixelSizeOfScreen(UIScreen *s) {
    CGSize result = s.bounds.size;

    if ([s respondsToSelector: @selector(scale)]) {
        CGFloat scale = s.scale;
        result = CGSizeMake(result.width * scale, result.height * scale);
    }

    return result;
}

Полученное значение на iPhone4 будет { 640.0, 960.0 }.

3 голосов
/ 23 января 2011

Вот что я узнал.Поскольку iOS4,

[[UIScreen mainScreen] applicationFrame].size.width; и

[[UIScreen mainScreen] applicationFrame].size.height;

дают измерения в «точках», а не в «пикселях».Для всего остального пиксели = точки, но для iPhone4 каждая точка имеет 4 пикселя.Нормальные изображения масштабируются в iPhone4, поэтому каждый пиксель изображения отображается на точку.Это означает, что iPhone4 может запускать приложения iPhone без заметных изменений.

«яблочный» способ добавления изображений «высокого разрешения», использующих преимущества более высокого разрешения iPhone, состоит в замене «.png» на «@ 2x.png "в имени файла изображения, и удвойте плотность пикселей (фактически, только ширину и высоту) в изображении.Важно отметить, что не меняйте способ ссылки на изображение в вашем коде.
Так что, если в вашем коде есть «img.png», iPhone4 загрузит изображение «img@2x.png», если оно доступно.

Проблема в том, что, если вы пытаетесь разработать приложение Universal и включить отдельные изображения для всех возможных разрешений экрана / плотности пикселей, ваше приложение будет раздуваться довольно быстро.

Распространенным решением этой проблемы является вытягивание всех необходимых изображений из сети.Это сделает ваш бинарный файл красивым и маленьким.С другой стороны, это будет влиять на интернет-квоту вашего пользователя и будет действительно раздражать пользователей, у которых нет Wi-Fi - особенно, если у вашего приложения нет других причин использовать сеть (и выне говорите, что вашему приложению нужна сеть в описании вашего магазина приложений.)

К счастью, я нашел другой способ.Часто, когда вы уменьшаете изображение, iPhone4 достаточно умен, чтобы использовать увеличенную плотность пикселей масштабированного изображения.Например, у вас может быть:

UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
   [UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateNormal];

Теперь, если buttonImage.png имеет размер 200x100, он будет отлично себя вести во всем.Точно так же, если вы начинаете с красивого изображения 640x960 (пиксель), которое довольно неплохо отображается на iPad, и вы уменьшаете его до изображения 320x480 для небольших экранов, используя что-то вроде:

+ (UIImage*)imageWithImage:(UIImage*)image newX:(float)newX newY:(float)newY{
    CGSize newSize=CGSizeMake((CGFloat)newX, (CGFloat)newY);
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0,0,newX,newY)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

It должно отображаться довольно неплохо на iPhone4.Хитрость не в том, чтобы удвоить масштабирование.Например, если вы сделаете что-то вроде:

UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
    [indicatorButton setBackgroundImage:
       [Utilities imageWithImage:[UIImage imageNamed:@"buttonImage.png"] newX:100 newY:50] forState:UIControlStateNormal];

Тогда вы потеряете плотность пикселей и ваше изображение будет выглядеть «пиксельно» на iPhone4.

Наконец, если выЕсли вы хотите определить, являетесь ли вы iPhone4 (не обязательно, если вы используете описанную выше технику), может пригодиться следующий код:

+(bool)imAnIphone4{
    return([[UIScreen mainScreen]respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale==2);
}
1 голос
/ 23 января 2011

Вы переименовали изображения в img.png@2x?И вы должны включить отображение Retina в вашем коде.

Даже если вы установите симулятор на отображение Retina, НО код не включает отображение Retina, отображаемая графика будет 320x480.

...