6

我正在研究制作一个应用程序,用户可以在其中更改UITextField. 我正在研究 Aviary 应用程序,我看到用户不仅可以增加或减少文本的大小,还可以更改其方向。

在此处输入图像描述

所以我想问的问题是

1)他们是CoreText用来做这件事的,他们只是用普通的旧的UILabel还是UIText

2)我不知道如何动态调整大小?他们在使用UIView吗?

3) 我在谷歌上搜索了 CoreText 教程、示例、检查了苹果文档和示例项目、查看了可可控件和 github,但我仍然没有看到任何示例代码或教程可以说明这是如何完成的。

有人会好心给我指出一些方向或教程吗?

4

1 回答 1

7

关于字体的外观,有几个选项:

  1. 您可以使用该标准UILabel来实现您在此处看到的大部分效果(字体、大小、颜色、旋转)。超出标准的一项功能是UILabel字体周围的白色笔划。但是,有效的iOS 6,您也可以使用它的属性来实现红色文本周围的白色描边效果,标准UILabel使用它的attributedText属性,即NSAttributedString.

  2. 在 6.0 之前的 iOS 版本中,要实现文本周围的白色笔触颜色,您必须使用CoreGraphicsCoreText

关于文本的动态调整大小、旋转和移动,他们无疑只是使用调整transform视图属性的手势识别器(更准确地说,可能调整transform旋转,调整centerframe拖动,同时调整frame字体大小用于调整大小(如果只使用scale转换,最终可能会出现不良像素化)。

如果您在 Stack Overflow 上搜索有关手势识别器以及拖动、调整大小和旋转视图的问题,您将获得相当多的成功。


在 iOS 6 中,如果您想要带有白色边框的红色文本UILabel,您可以执行以下操作:

// create attributes dictionary

NSDictionary *attributes = @{
                             NSFontAttributeName            : [UIFont systemFontOfSize:48.0],
                             NSForegroundColorAttributeName : [UIColor redColor],
                             NSStrokeColorAttributeName     : [UIColor whiteColor],
                             NSStrokeWidthAttributeName     : @(-3)
                             };

// make the attributed string

NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:@"bigcat"
                                                                   attributes:attributes];

self.label.attributedText = stringToDraw;

有关 iOS 中的属性字符串的信息,请参阅:


如果您需要支持 iOS 6 之前的 iOS 版本,则必须使用 CoreText 或 CoreGraphics。CoreText 演绎版可能如下所示:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    if (!self.text)
        return;

    // create a font

    CTFontRef sysUIFont = CTFontCreateUIFontForLanguage(kCTFontSystemFontType, self.fontSize, NULL);

    // create attributes dictionary

    NSDictionary *attributes = @{
                                 (__bridge id)kCTFontAttributeName            : (__bridge id)sysUIFont,
                                 (__bridge id)kCTForegroundColorAttributeName : (__bridge id)[self.fillColor CGColor],
                                 (__bridge id)kCTStrokeColorAttributeName     : (__bridge id)[self.borderColor CGColor],
                                 (__bridge id)kCTStrokeWidthAttributeName     : @(-3)
                                 };

    // make the attributed string

    NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:self.text
                                                                       attributes:attributes];

    // begin drawing

    CGContextRef context = UIGraphicsGetCurrentContext();

    // flip the coordinate system

    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // create CTLineRef

    CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)stringToDraw);

    // figure out the size (which we'll use to center it)

    CGFloat ascent;
    CGFloat descent;
    CGFloat width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL);
    CGFloat height = ascent + descent;
    CGSize stringSize = CGSizeMake(width, height);

    // draw it

    CGContextSetTextPosition(context,
                             (self.bounds.size.width  - stringSize.width)  / 2.0,
                             (self.bounds.size.height - stringSize.height + descent) / 2.0);
    CTLineDraw(line, context);

    // clean up

    CFRelease(line);
    CFRelease(sysUIFont);
}

以上更完整的实现可以在我的GitHub CoreText Demonstration中找到。


这是一个非常简单的 Core Graphics 实现,drawRect它在文本周围编写带有轮廓的文本:

@implementation CustomView

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    if (!self.text)
        return;

    // begin drawing

    CGContextRef context = UIGraphicsGetCurrentContext();

    // flip the coordinate system

    CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(M_PI_4 / 2.0));
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // write the text

    CGContextSelectFont (context, "Helvetica", self.fontSize, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode (context, kCGTextFillStroke);
    CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]);
    CGContextSetLineWidth(context, 1.5);
    CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]);
    CGContextShowTextAtPoint (context, 40, 100, [self.text UTF8String], [self.text length]);
}

@end
于 2013-04-16T14:21:02.127 回答