Как вызвать [[UIScreen mainScreen] scale] в универсальном приложении для iphone и ipad - PullRequest
1 голос
/ 28 июня 2010

Я делаю универсальное приложение, которое будет работать на ipad и iphone.Пока все хорошо, но я только что обновил свой SDK до ios4 и хочу вызвать [[UIScreen mainScreen] scale] (scale нет в 3.2 sdk, и ipad еще не имеет ios4).

Я знаю, что могу позвонить [[UIScreen mainScreen] responsedsToSelector: @selector (scale)], чтобы узнать, могу ли я вызвать его, но мне все еще нужно вызвать функцию (и иметь возможность доступавозвращаемое значение) в моем коде, чтобы он мог работать на iphone.

РЕДАКТИРОВАНИЕ: Для ясности, моя проблема заключается в том, что при использовании кода [[UIScreen mainScreen] scale] при сборке 3.2 SDK возникает ошибка.Эта ошибка «Несовместимые типы в присваивании».Поэтому мне нужно иметь возможность вызывать эту функцию для 4.0 SDK, но при этом иметь сборку проекта для 3.2 SDK.

Ответы [ 3 ]

4 голосов
/ 28 июня 2010

Ну, вы можете просто обернуть каждый вызов в оператор if, например:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    //do scale stuff here
}

Но лучший способ (который может потребовать реструктуризации всего приложения) - это иметь отдельные контроллеры представления для iPad и iPhone.

Чтобы получить масштаб устройства для кроссплатформенного вида или чего-то еще, вы можете сделать так:

CGFloat scale;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale=[[UIScreen mainScreen] scale];
} else {
    scale=1; //only called on iPad.
}

Чтобы не вводить это каждый раз, вы можете объявить категорию на UIScreen, которая использует этот код внутри метода -realScale или чего-то еще.

Все эти методы требуют установки базового SDK на 4.0 (чтобы вы могли получить доступ к API 4.0) и минимальной цели развертывания iPhone до 3.2 (чтобы он работал на iPad)

1 голос
/ 28 июня 2010

Argh. Все не так.

  • Установите «Базовый SDK» на iPhone OS 4.0
  • Установите «Цель развертывания iPhone OS» на iPhone OS 3.2.
0 голосов
/ 28 июня 2010

Я закончил тем, что нашел решение, прежде чем задавать свой вопрос, но мне потребовалось целую вечность, чтобы понять, что я решил опубликовать свой вопрос и ответ на случай, если это поможет другим.был в состоянии вызвать шкалу селектора на [UIScreen mainScreen] и все еще иметь версию сборки ipad:

CGFloat screenScale;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    //iphones with the latest SDK should end up in here (and also ipads when they are updated)
    NSMethodSignature * scaleSignature = [UIScreen instanceMethodSignatureForSelector:@selector(scale)];
    NSInvocation * scaleInvocation = [NSInvocation invocationWithMethodSignature:scaleSignature];
    [scaleInvocation setTarget:[UIScreen mainScreen]];
    [scaleInvocation setSelector:@selector(scale)];
    [scaleInvocation invoke];

    NSInteger returnLength = [[scaleInvocation methodSignature] methodReturnLength];
    //good memory management to check this in case anything changed in the future
    if (returnLength == sizeof(CGFloat)) {
        [scaleInvocation getReturnValue:&screenScale];
    } else {
        //default value
        screenScale = 1.0f;
    }
} else {
    //ipad (for now) and other SDK < 4.0 should come here
    screenScale = 1.0f;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...