- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在研究制作一个用户可以更改 UITextField
的大小和方向的应用程序。我正在研究 Aviary 应用程序,我看到用户不仅可以增加或减少文本的大小,还可以更改其方向。
所以我想问的问题是
1) 他们是否使用 CoreText
来执行此操作?他们是否只使用普通的旧 UILabel
或 UIText
?
2) 我不知道你如何动态调整大小?他们在使用 UIView
吗?
3) 我用谷歌搜索了 CoreText 教程、示例、检查了 apple 文档和示例项目,查看了 cocoa 控件和 github,但我仍然没有看到任何示例代码或教程来说明这是如何完成的。
有没有人愿意给我指明方向或教程?
最佳答案
关于字体的外观,有几个选项:
您可以使用标准的 UILabel
来实现您在此处看到的大部分效果(字体、大小、颜色、旋转)。超出标准 UILabel
的一项功能是字体周围的白色描边。但是,从 iOS 6 开始,您还可以使用标准 UILabel
使用其 attributedText
实现红色文本周围的白色描边效果。属性,这是一个 NSAttributedString
.
在 6.0 之前的 iOS 版本中,要实现文本周围的白色描边颜色,您必须使用 CoreGraphics或 CoreText .
关于文本的动态调整大小、旋转和移动,他们无疑只是使用调整 View 的 transform
属性的手势识别器(更准确地说,可能是调整 transform
用于旋转,调整 center
或 frame
用于拖动,调整 frame
和字体大小以调整大小(如果您只使用scale
转换,你最终可能会出现不希望的像素化)。
如果您在 Stack Overflow 中搜索有关手势识别器以及 View 的拖动、调整大小和旋转的问题,您将获得相当多的成功。
在 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 中找到上述内容的更完整实现。 .
这是 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
关于iphone - 这是 CoreText 吗? - 鸟舍文本捏缩放展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16038304/
我是一名优秀的程序员,十分优秀!