Как нарисовать повернутый текст, не ограничиваясь набором символов MacRoman? - PullRequest
3 голосов
/ 29 января 2010

Мой блог уже упоминался здесь как ответ на вопросы. Я не могу связаться с одним из них, потому что эта форма утверждает, что я спамер. Вздох. Во всяком случае, теперь я хочу написать окончательный пост в блоге о рисовании повернутого текста, так что он также может быть использован для ответов здесь (хех). Вот моя первая попытка:

http://www.platinumball.net/blog/2009/06/01/drawing-nsstrings-in-unusual-rotations/

Это работает хорошо, он делает все, что я хочу, за исключением за то, что он использует CGContextSelectFont (), который ограничивает вывод текста в MacRoman. Это Сукк.

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

-(void)drawAtPoint:(CGPoint)point withFont:(UIFont*)font
 orientation:(WBOrientation)orient
{
    CGContextRef       ctxt = [self contextSave];
    const std::string  tbuf = toStdString(self, NSMacOSRomanStringEncoding);
    CGAffineTransform  tran = CGAffineTransformMake(1, 0, 0, -1, 0, 0);

    switch (orient)
    {
        case WBOrientUp:
        // nothing to do
        break;

        case WBOrientDown:
        tran = CGAffineTransformRotate(tran, degreesToRadians(180.0));
        break;

        case WBOrientLeft:
        tran = CGAffineTransformRotate(tran, degreesToRadians(90.0));
        break;

        case WBOrientRight:
        tran = CGAffineTransformRotate(tran, degreesToRadians(-90.0));
        break;

        default:
        assert(false);
        break;
    }

    contextFont(ctxt, font);
    CGContextSetTextDrawingMode(ctxt, kCGTextFill);
    CGContextSetTextMatrix(ctxt, tran);
    CGContextSetTextPosition(ctxt, point.x, point.y);
    CGContextShowText(ctxt, tbuf.c_str(), tbuf.length());

    [self contextRestore:ctxt];
}

Ответы [ 2 ]

1 голос
/ 31 января 2010

Установите CGContext в качестве текущего графического контекста, используя функцию UIGraphicsPushContext , затем рисуйте строку, используя UIKit , затем вытолкните контекст обратно из стека, используя UIGraphicsPopContext функция .

Решение AppKit (Mac) по сути то же самое, с использованием NSGraphicsContext для шага 1 и Добавления NSString AppKit для шага 2. Для контекстов окна в -[NSView drawRect:] шаг 3 идет прочь (вы получите CGContext из NSGraphicsPort на шаге 1, то есть он уже установлен); для других контекстов, таких как растровые изображения или контексты PDF, вы должны использовать один и тот же метод NSGraphicsPort (setCurrentContext:) как на шаге 1, так и на шаге 3.

1 голос
/ 29 января 2010

только через несколько дней после того, как я сделал это сам =)

вот как я это решил:

view.layer.transform = CATransform3DRotate(view.layer.transform, 3.1415, 0,0,1); // this is for 180 degrees.
...