iOS:Как вы измеряете ширину и высоту струны с помощью Quartz?

StackOverflow https://stackoverflow.com/questions/913470

Вопрос

Прежде чем я задам свои вопросы, это из документации Apple re:как определить ширину строки с помощью Quartz:

Если измерения текста важны для вашего приложения, можно рассчитать их с помощью Quartz 2D functions.Однако сначала вы могли бы рассмотреть возможность использования ATSUI, сила которого заключается в расположении текста и измерении.ATSUI имеет несколько функций, которые получают текстовые показатели.Не вы можете получить текстовые показатели только после компоновки, но в редких случаях если они вам нужны, вы можете получить текстовые показатели до компоновки.В отличие от Quartz, для которого вы должны выполнить вычисления самостоятельно, ATSUI вычисляет измерения за вас.Например, вы можете получить прямоугольник, ограничивающий изображение для текста, вызвав функцию ATSUI ATSUMeasureTextImage.

Если вы решите, что Quartz text соответствует вашим потребностям лучше, чем ATSUI (или Cocoa), вы можете выполнить следующие действия, чтобы измерить ширину текста, прежде чем Quartz его отрисовывает:

  1. Вызовите функцию CGContextGetTextPosition, чтобы получить текущую позицию текста.
  2. Установите режим рисования текста в kCGTextInvisible с помощью функции CGContextSetTextDrawingMode.
  3. Нарисуйте текст, вызвав функцию CGContextShowText, чтобы нарисовать текст в текущей текстовой позиции.
  4. Определите конечную позицию текста, вызвав функцию CGContextGetTextPosition.
  5. Вычтите начальную позицию из конечной позиции, чтобы определить ширину текста.

Вот мои вопросы:

  1. Действительно ли это лучший способ определить ширину строки с использованием Core Graphics?Это кажется надуманным, и поскольку мой текст сосуществует с 2D-графическими элементами, я бы хотел использовать один и тот же контекст для всего рендеринга.Я надеялся, что найдется какой-нибудь компактный метод, например:

    CGContextGetTextWidthAndHeight(context, text);
    
  2. Я читал, что ATSUI устарел и будет заменен Основным текстом.Правда ли это, и если да, то есть ли это в iOS?

Это было полезно?

Решение

В iPhone SDK есть семейство методов на NSString это обеспечит то, что вы хотите.

Начиная с iOS 7.0, этими методами являются:

- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:

В более старых версиях iOS у нас были эти, теперь устаревшие:

– sizeWithFont:  
– sizeWithFont:forWidth:lineBreakMode:  
– sizeWithFont:constrainedToSize:  
– sizeWithFont:constrainedToSize:lineBreakMode:  
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

Другие советы

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

Я согласен с PGB, когда вы делаете "простую" графику, и вы гарантированно работаете в основном потоке.Однако sizeWithFont выполняет то же самое, что и описанный вами метод - он просто делает это за вас с помощью UIGraphicsGetCurrentContext() .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top