这是CoreText? – 鸟舍文字捏放大展开
我正在研究制作一个应用程序,用户可以在其中更改UITextField
的大小和方向。 我正在研究Aviary的应用程序,我看到的是,用户不仅可以增加或减less文本的大小,而且还可以改变其方向。
所以我想问的问题是
1)他们使用CoreText
来做到这一点,他们只是使用普通的旧UILabel
或UIText
?
2)我不知道如何dynamicresize? 他们使用UIView
?
3)我search了CoreText教程,例子,检查苹果文档和示例项目,看着cocoa控件和github,我还没有看到任何示例代码或教程,将显示如何完成。
有人愿意指点我的方向或教程吗?
关于字体的外观,有几个选项:
-
你可以使用标准的
UILabel
来实现你在这里看到的大部分效果(字体,大小,颜色,旋转)。 超出标准UILabel
的一个特征是围绕字体的白色笔划。 但是,有效的iOS 6,你也可以使用标准的UILabel
使用它的attributedText
文本属性,这是一个NSAttributedString
实现红色文字周围的白色笔画的效果。 -
在6.0之前的iOS版本中,要实现文本周围的白色笔触颜色,必须使用CoreGraphics或CoreText 。
关于文本的dynamicresize,旋转和移动,他们毫无疑问只是使用手势识别器来调整视图的transform
属性(更准确地说,可能调整旋转的transform
,调整拖动的center
或frame
,resize的frame
和字体大小(如果您只是使用scale
转换,最终会导致不希望的像素化)。
如果您search堆栈溢出以查找有关手势识别器的问题以及拖动视图,调整视图大小和旋转视图,则会获得相当不错的效果。
在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中的属性string的信息,请参阅:
-
WWDC 2012 – #222 – iOS的Attributed Strings简介
-
WWDC 2012 – #230 – 适用于iOS的高级着陆string
如果您需要在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演示中find 。
下面是drawRect
一个非常简单的Core Graphics实现,它用文本的大纲来写文本:
@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