2012-05-15 2 views
10

Я новичок iOS. Как сделать I UIBezierPath, который следует за алфавитом, скажем «B». Целью является отслеживание касаний по этому пути.iOS UIBezierPath, который следует за формой шрифта

Заранее спасибо.

+2

Вы получили решение об этом? –

+0

Привет .. Было ли у вас какое-то решение? –

ответ

0

Для чертежей в Quartz2D я использую приложение OSX под названием PaintCode (http://www.paintcodeapp.com/). Это в основном приложение для рисования векторов, которое генерирует кварцевый код рисунка, который вы делаете. На самом деле это довольно ужасно. Аналогичное приложение называется Opacity, но я его не пробовал.

С такими Приложениями вы можете иметь B на заднем плане в качестве руководства и нарисовать свой BezierPath над ним. Как только вы закончите, просто скопируйте сгенерированный код и вставьте его в свой проект.

Надеюсь, это поможет.

+0

BTW, вы можете скачать демо-версию. Возможно, этого может быть достаточно для вашей проблемы. – Marcal

7

CoreText.framework предоставляет методы, чтобы получить путь слова

см http://www.codeproject.com/Articles/109729/Low-level-text-rendering

пример кода, созданного Ole Бегеманн. Извините, я забыл загрузить URL-адрес демо-версии AnimatedPath.

CGMutablePathRef letters = CGPathCreateMutable(); 

CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica-Bold"), 72.0f, NULL); 
NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys: 
         (id)font, kCTFontAttributeName, 
         nil]; 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Hello World!" 
                   attributes:attrs]; 
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attrString); 
CFArrayRef runArray = CTLineGetGlyphRuns(line); 

// for each RUN 
for (CFIndex runIndex = 0; runIndex < CFArrayGetCount(runArray); runIndex++) 
{ 
    // Get FONT for this run 
    CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runArray, runIndex); 
    CTFontRef runFont = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName); 

    // for each GLYPH in run 
    for (CFIndex runGlyphIndex = 0; runGlyphIndex < CTRunGetGlyphCount(run); runGlyphIndex++) 
    { 
     // get Glyph & Glyph-data 
     CFRange thisGlyphRange = CFRangeMake(runGlyphIndex, 1); 
     CGGlyph glyph; 
     CGPoint position; 
     CTRunGetGlyphs(run, thisGlyphRange, &glyph); 
     CTRunGetPositions(run, thisGlyphRange, &position); 

     // Get PATH of outline 
     { 
      CGPathRef letter = CTFontCreatePathForGlyph(runFont, glyph, NULL); 
      CGAffineTransform t = CGAffineTransformMakeTranslation(position.x, position.y); 
      CGPathAddPath(letters, &t, letter); 
      CGPathRelease(letter); 
     } 
    } 
} 
CFRelease(line); 

UIBezierPath *path = [UIBezierPath bezierPath]; 
[path moveToPoint:CGPointZero]; 
[path appendPath:[UIBezierPath bezierPathWithCGPath:letters]]; 

CGPathRelease(letters); 
CFRelease(font); 

заменить «Hello World!» На «Слово, в котором вы нуждаетесь».

+0

Обратите внимание, что вы должны размещать полезные пункты ответа здесь, на этом сайте, или ваши риски для публикации удаляются как [«Не ответ»] (http://meta.exackchange.com/q/8259). Вы можете по-прежнему включать ссылку, если хотите, но только как ссылку. Ответ должен стоять сам по себе, не нуждаясь в ссылке. –

+0

Спасибо за ваше напоминание – nova

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