Различные шрифты Тексты для разных устройств в Xcode 6 [дубликат]

Просто для удовольствия я играл с представлением поплавков, следуя определениям из стандарта C99, и я написал код ниже.

Код печатает двоичное представление поплавков в 3 отдельных группах

SIGN EXPONENT FRACTION

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

Поэтому, когда вы пишете float x = 999... компилятор преобразует это число в битовое представление, напечатанное функцией xx, так что сумма, напечатанная функцией yy, будет равна заданному числу.

В действительности эта сумма является только приближение. Для числа 999,999,999 компилятор будет вставлять в бит представление float число 1,000,000,000

После кода я присоединяю консольный сеанс, в котором я вычисляю сумму терминов для обеих констант (минус PI и 999999999) который действительно существует в аппаратном обеспечении, вставленном там компилятором.

#include <stdio.h>
#include <limits.h>

void
xx(float *x)
{
    unsigned char i = sizeof(*x)*CHAR_BIT-1;
    do {
        switch (i) {
        case 31:
             printf("sign:");
             break;
        case 30:
             printf("exponent:");
             break;
        case 23:
             printf("fraction:");
             break;

        }
        char b=(*(unsigned long long*)x&((unsigned long long)1<<i))!=0;
        printf("%d ", b);
    } while (i--);
    printf("\n");
}

void
yy(float a)
{
    int sign=!(*(unsigned long long*)&a&((unsigned long long)1<<31));
    int fraction = ((1<<23)-1)&(*(int*)&a);
    int exponent = (255&((*(int*)&a)>>23))-127;

    printf(sign?"positive" " ( 1+":"negative" " ( 1+");
    unsigned int i = 1<<22;
    unsigned int j = 1;
    do {
        char b=(fraction&i)!=0;
        b&&(printf("1/(%d) %c", 1<<j, (fraction&(i-1))?'+':')' ), 0);
    } while (j++, i>>=1);

    printf("*2^%d", exponent);
    printf("\n");
}

void
main()
{
    float x=-3.14;
    float y=999999999;
    printf("%lu\n", sizeof(x));
    xx(&x);
    xx(&y);
    yy(x);
    yy(y);
}

Вот сеанс консоли, в котором я вычисляю реальное значение float, которое существует в аппаратном обеспечении. Я использовал bc для печати суммы терминов, выводимых основной программой. Можно вставить эту сумму в python repl или что-то подобное.

-- .../terra1/stub
@ qemacs f.c
-- .../terra1/stub
@ gcc f.c
-- .../terra1/stub
@ ./a.out
sign:1 exponent:1 0 0 0 0 0 0 fraction:0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1
sign:0 exponent:1 0 0 1 1 1 0 fraction:0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0
negative ( 1+1/(2) +1/(16) +1/(256) +1/(512) +1/(1024) +1/(2048) +1/(8192) +1/(32768) +1/(65536) +1/(131072) +1/(4194304) +1/(8388608) )*2^1
positive ( 1+1/(2) +1/(4) +1/(16) +1/(32) +1/(64) +1/(512) +1/(1024) +1/(4096) +1/(16384) +1/(32768) +1/(262144) +1/(1048576) )*2^29
-- .../terra1/stub
@ bc
scale=15
( 1+1/(2) +1/(4) +1/(16) +1/(32) +1/(64) +1/(512) +1/(1024) +1/(4096) +1/(16384) +1/(32768) +1/(262144) +1/(1048576) )*2^29
999999999.999999446351872

Вот и все. Фактически значение 999999999

999999999.999999446351872

Вы также можете проверить с помощью bc, что -3.14 также возмущено. Не забудьте установить коэффициент scale в bc.

Отображаемая сумма - это то, что внутри аппаратного обеспечения. Значение, которое вы получаете, вычисляя его, зависит от установленного вами масштаба. Я установил коэффициент scale равным 15. Математически, с бесконечной точностью, кажется, что это 1 000 000 000.

20
задан Madan gupta 2 February 2016 в 14:58
поделиться

3 ответа

Вы должны использовать autoshrink.

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


Превью для iPhone5, iPhone6 ​​и iPhone 6 +

В инспекторе вы должны выбрать минимальный размер шрифта или минимальный размер шрифта в перед Autoshrink. Это позволяет содержимому изменять размер шрифта в соответствии с меткой.

Здесь я устанавливаю минимальную шкалу шрифта на 0,5, поэтому минимальный размер составляет половину текущего размера (31,0 ) . Текст будет стараться соответствовать, пока не достигнет минимального масштаба / размера.

(Обычно для этого не используйте «Затянуть расстояние между буквами». Затяните расстояние между буквами, используя тот же размер шрифта, и уменьшите расстояние между буквами.


Возможно, вы захотите протестировать с помощью широкоэкранного устройства, такого как: iPad Pro, а также на меньшем экране, таком как iPhone 4S.

Autoshrink не будет регулировать размер шрифта больше, чем тот, который установлен на этикетке, это означает, что если вы сделаете ярлык той же ширины, что и на экране, но размер шрифта будет равен 14, он попытается увеличить размер шрифта до тех пор, пока он не достигнет этого размера.

Чтобы он действительно работал, выберите большой размер шрифта.

Вы можете комбинировать автозагрузку с классами размера, чтобы изменить максимальный размер шрифта в зависимости от устройства / ориентации.


Если вы хотите использовать автозапуск с UIButton s, вы можете плохо установить это поведение с помощью двух строк кода.

myButton.titleLabel.minimumScaleFactor = 0.5;
myButton.titleLabel.adjustsFontSizeToFitWidth = YES;
46
ответ дан Crazyrems 24 August 2018 в 17:12
поделиться

Вы можете сделать это, используя классы размера. каждый размер экрана с использованием класса размера, это приведет к появлению четырех абстрактных устройств: регулярная ширина - регулярная высота, регулярная ширина - компактная высота, компактная ширина - обычная высота и компактная ширина - компактная высота. В приведенной ниже таблице показаны устройства iOS и соответствующие классы их размеров. 

Чтобы установить размер шрифта для этого определенного класса размера, сначала выберите UILabel. Под инспектором атрибутов вы должны увидеть кнопку плюс (+) рядом с полем шрифта. Нажмите кнопку + и выберите «Компактная ширина»> «Обычная высота» (или согласно вашему требованию выберите ширину и высоту). Затем вы увидите новую запись для опции «Шрифт», которая посвящена этому классу определенного размера. Сохраните размер неповрежденным для исходного параметра Font, но измените размер поля шрифта wC hR (OR в соответствии с вашим выбором) на нужные точки (например, 14).

5
ответ дан Madan gupta 24 August 2018 в 17:12
поделиться

Привет, если вы добавляете UILabel из раскадровки, вы можете установить другой шрифт для всего доступного макета.

6
ответ дан Mobile Apps Expert 24 August 2018 в 17:12
поделиться