2012-12-19 2 views
3

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

Как рассчитать этот размер?

+0

Заканчивать http://stackoverflow.com/questions/10437567/measure-dimensions-of-biggest-character-in-a -cgfont –

ответ

-1

Что вы ищете, это Font Bounding Box (или BBox). В прошивке, вы будете нуждаться в CGFontRef, а затем использовать функцию:

CGRect CGFontGetFontBBox (
    CGFontRef font 
); 

Это возвращает ограничивающий прямоугольник шрифта, который является объединением всех глифов ограничительных рамок в шрифте. Он возвращает значение в глифных единицах.

+0

Спасибо, Дэвид, большое спасибо! Это то, чего я хочу. Замечательно! –

+0

Когда я снова отлаживаю время и время приложения, я обнаружил, что значение размера шрифта, переданное в API, - это максимальная высота, которую может принимать char, например: fontsize = 24, тогда размер символа в пикселе может быть {14, 24} ... {21, 24} .. {9, 24}, хотя ширина меняется, но высота все равно 24. Я не уверен, что это просто совпадение или нет. Что Вы думаете об этом? –

+0

Извините, всего лишь минуту назад я попытался установить размер шрифта = 50, а затем высоту 59: <. Ха-ха. Но, может быть, ширина никогда не будет больше высоты? Я просто догадываюсь. –

-1

хорошо, вы можете использовать sizeWithFont:

и проверить самый большой (или самый высокий или самый большой в районе)

она хорошо работает для ширины и области, но, кажется, что все персонажи получили одинаковую высоту , даже точки "."

в любом случае, я думаю, что-то вроде этого следует ответить на ваш вопрос:

UIFont* aFont = [UIFont fontWithName:@"HelveticaNeue" size:15]; 
NSString* charsToTest = @"abcdf...xyz, ABCD...XYZ, 0123..."; 
float maxArea = 0; 
float maxWidth = 0; 
float maxHeight = 0; 
NSString* largerChar; 
NSString* tallerChar; 
NSString* biggerChar; 
for (int i = 0; i<charsToTest.length; i++) { 
    NSRange currentRange; 
    currentRange.length = 1; 
    currentRange.location = i; 
    NSString* currentCharToTest = [charsToTest substringWithRange:currentRange]; 
    CGSize currentSize = [currentCharToTest sizeWithFont:aFont]; 
    if (currentSize.width > maxWidth) { 
     maxWidth = currentSize.width; 
     largerChar = currentCharToTest; 
     NSLog(@"char:%@, new record width: %f", largerChar, maxWidth); 
    } 
    if (currentSize.height > maxHeight) { 
     maxHeight = currentSize.height; 
     tallerChar = currentCharToTest; 
     NSLog(@"char:%@, new record height:%f", tallerChar, maxHeight); 
    } 
    float currentArea = currentSize.height * currentSize.width; 
    if (currentArea > maxArea) { 
     maxArea = currentArea; 
     biggerChar = currentCharToTest; 
     NSLog(@"char:%@, new area record: %f", biggerChar, maxArea); 
    } 
} 
// final resut: 
NSLog(@"\n\n"); 
NSLog(@"char:%@ --> MAX WIDTH IS: %f", largerChar, maxWidth); 
NSLog(@"char:%@ --> MAX HEIGHT IS: %f", tallerChar, maxHeight); 
NSLog(@"char:%@ --> MAX AREA IS: %f\n\n", biggerChar, maxArea); 
+0

Помимо долгого времени, это будет проверять только те конкретные символы в строке, которую вы ему даете. Это далека от «максимального размера, который наибольший символ может принимать во всем наборе символов юникода», как указано в вопросе. Ограничивающий шрифт был специально разработан для ответа на этот вопрос для больших наборов шрифтов (это кеш-калькулятор, который вы предлагаете здесь для полного набора символов, поддерживаемого шрифтом, если хотите). –

+0

проблема с CGFontGetFontBBox заключается в том, что он возвращает CGRect не в пикселе: «Значение указано в единицах пространства глифа», и я не уверен, что этого достаточно для исходного вопроса. Для списка символов ... конечно, я просто сфокусировал свой ответ на размерном аспекте, это не такая большая проблема, чтобы получить желаемый список ... – meronix

+0

единицы пространства глифа - единственные разумные единицы, которые это может вернуть - все, что у вас есть для этого нужно учитывать размер точки. И это очень большая проблема, чтобы использовать ваш подход, потому что вопрос говорит конкретно о полном наборе Unicode. Знаете ли вы, сколько символов вы можете иметь в шрифте Unicode? Я сомневаюсь, что вы хотите сделать пару тысяч звонков в sizeWithFont. Извините, но ваш подход не правильный. –

Смежные вопросы