- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
背景: 我在 iOS 5 中开始了我的项目,并构建了一个带有图层的漂亮按钮。我在按钮上添加了一个 textLayer 并使用以下代码将其居中:
float textLayerVerticlePadding = ((self.bounds.size.height - fontSize) /2);
textLayer = [[CATextLayer alloc]init];
[textLayer setFrame:CGRectOffset(self.bounds, 0, textLayerVerticlePadding)];
HelveticaNeue
为 iOS5 和 iOS6 都留下了一点空间,不像
Helvetica
在 iOS5 中顶部没有空间,在 iOS6 中空间很小。
float textLayerVerticlePadding = ((self.bounds.size.height - fontSize) /2) - (fontSize/6);
[textLayer setFrame:CGRectOffset(self.bounds, 0, textLayerVerticlePadding)];
HelveticaNeue-Bold
进行了测试。我不能说别的。
最佳答案
在 iOS 5 及更早版本中,CATextLayer
中的第一个基线始终位于从 CTLineGetTypographicBounds
获得的上升位置的边界顶部下方,当传递使用第一行的字符串制作的 CTLine
时。
在 iOS 6 中,这不再适用于所有字体。因此,当您定位 CATextLayer
时,您无法再可靠地决定将它放在哪里以获得正确的视觉对齐。或者你可以吗? ...
首先,旁白:不久前在 iOS 5 中尝试计算 CATextLayer
的定位行为时,我尝试使用大写高度、UIFont 的上升等的所有组合,最后发现从 CTLineGetTypographicBounds
上升是我需要的。在这个过程中,我发现 a) 从 UIFont ascender
、 CTFontGetAscent
和 CTLineGetTypographicBounds
的上升对于某些字体是不一致的,并且 b) 上升经常很奇怪 - 要么裁剪重音,要么在上方留出很多空间。 a) 的解决方案是知道使用哪个值。 b) 除了通过抵消 CATextLayer
边界在上面留下足够的空间之外,没有真正的解决方案,如果它可能会让你的口音被剪掉。
回到 iOS 6。如果您避免使用最糟糕的字体(从 6.0 开始,并且可能会发生变化),您仍然可以使用其余字体对 CATextLayer
进行编程定位。违规者是: AcademyEngravedLetPlain , Courier , HoeflerText 和 Palatino - 从视觉上看,这些系列正确定位(即没有剪裁)在代码中的三个基准源,但不剪裁被放置。 Helvetica 和 .HelveticaNeueUI (又名系统字体)系列在 CATextLayer
给出的上升处与基线正确定位,但其他上升源没有用。
我做过的一些测试示例。示例文本以不同的颜色绘制了 3 次。坐标原点在灰色框的左上角。黑色文本由 UIFont ascender
绘制,从 CTLineDraw
上升向下偏移; CTLineGetTypographicBounds
绘制透明红色,边界等于灰色框;透明蓝色是用 CATextLayer
UIKit
添加 NSString
位于灰色框的原点和 drawAtPoint:withFont:
绘制的。
1) 一个表现良好的字体,Copperplate-Light。这三个样本是重合的,呈现栗色,这意味着所有来源的上升都足够接近。 iOS 5 和 6 相同。
2) Courier 在 iOS 5 下。UIFont
将文本定位得太高(红色),但是从 CATextLayer
(黑色)上升的 CTLineDraw
匹配 CTLineGetTypographicBounds
定位 - 所以我们可以从那里放置和更正。 CATextLayer
(蓝色)放置文本而不剪裁。 ( Helvetica 和 .HelveticaNeueUI 在 iOS 6 中的行为是这样的)
3) Courier 在 iOS 6 下。NSString drawAtPoint:withFont:
(红色)现在放置文本使其不被剪裁,但定位不再匹配从 CATextLayer
(黑色)或从 CTLineGetTypographicBounds
(蓝色)中使用的 UIFont
上升器的上升。这对于程序定位是不可用的。 ( AcademyEngravedLetPlain 、 HoeflerText 和 Palatino 在 iOS 6 中也表现得如此)
希望这有助于避免我经历的一些时间浪费,如果你想深入一点,可以试试这个:
- (NSString*)reportInconsistentFontAscents
{
NSMutableString* results;
NSMutableArray* fontNameArray;
CGFloat fontSize = 28;
NSString* fn;
NSString* sample = @"Éa3Çy";
CFRange range;
NSMutableAttributedString* mas;
UIFont* uifont;
CTFontRef ctfont;
CTLineRef ctline;
CGFloat uif_ascent;
CGFloat ctfont_ascent;
CGFloat ctline_ascent;
results = [NSMutableString stringWithCapacity: 10000];
mas = [[NSMutableAttributedString alloc] initWithString: sample];
range.location = 0, range.length = [sample length];
fontNameArray = [NSMutableArray arrayWithCapacity: 250];
for (fn in [UIFont familyNames])
[fontNameArray addObjectsFromArray: [UIFont fontNamesForFamilyName: fn]];
[fontNameArray sortUsingSelector: @selector(localizedCaseInsensitiveCompare:)];
[fontNameArray addObject: [UIFont systemFontOfSize: fontSize].fontName];
[fontNameArray addObject: [UIFont italicSystemFontOfSize: fontSize].fontName];
[fontNameArray addObject: [UIFont boldSystemFontOfSize: fontSize].fontName];
[results appendString: @"Font name\tUIFA\tCTFA\tCTLA"];
for (fn in fontNameArray)
{
uifont = [UIFont fontWithName: fn size: fontSize];
uif_ascent = uifont.ascender;
ctfont = CTFontCreateWithName((CFStringRef)fn, fontSize, NULL);
ctfont_ascent = CTFontGetAscent(ctfont);
CFAttributedStringSetAttribute((CFMutableAttributedStringRef)mas, range, kCTFontAttributeName, ctfont);
ctline = CTLineCreateWithAttributedString((CFAttributedStringRef)mas);
ctline_ascent = 0;
CTLineGetTypographicBounds(ctline, &ctline_ascent, 0, 0);
[results appendFormat: @"\n%@\t%.3f\t%.3f\t%.3f", fn, uif_ascent, ctfont_ascent, ctline_ascent];
if (fabsf(uif_ascent - ctfont_ascent) >= .5f // >.5 can round to pixel diffs in display
|| fabsf(uif_ascent - ctline_ascent) >= .5f)
[results appendString: @"\t*****"];
CFRelease(ctline);
CFRelease(ctfont);
}
[mas release];
return results;
}
关于ios - CATextLayer 上来自 iOS 6 的不需要的垂直填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12567562/
我有几个 CATextLayers。当我双击其中之一时,我希望能够编辑它的字符串。想象一下在 Keynote 或许多其他应用程序中处理文本的方式。有什么想法吗? 我想在图层前面放置一个可编辑的文本字段
我在 CATextLayer 中绘制字符时遇到问题,使得图层的大小恰好等于字符的大小。 我使用下面的代码来获取与字符串中的字符对应的字形的大小。目前我忽略了变音符号,因此我假设字形和字符之间存在一对一
我已经束手无策了。我已经尝试了我认为的消除 CATextLayer 模糊的一切方法,但无济于事。诚然,有些东西是有帮助的,但是当放大 2 倍时,文本仍然太模糊,远不及非 CATextLayer 文本的
这让我发疯。每当我更改CATextLayer.foregroundColor属性的值时,无论我做什么,该更改都是动画的。例如,我有一个称为CATextLayer的layer,它是CALayer的子层s
我在使用 CATextLayer 时遇到了一些麻烦,这可能是我造成的,但我没有找到有关此主题的任何帮助。我在 OS X 上(在 iOS 上应该是一样的)。 我创建了一个比例因子 > 1 的 CATex
我有一个具有动态长度的动态字符串。我使用 CATextlayer 在 View 中绘制它。我设置了 wrapped = YES,但我不知道如何检查 View 中 CATextlayer 的行数来为另一
我正在开发一个需要更改 很多 CATextLayers 字符串的应用程序,但是,只有其中的一个或两个字符(但一般来说,字符串的长度约为 2-5字符)。 起初我使用的 UILabels 非常慢,因此我尝
我有一个带有 CATextLayer 子层的 CALayer。当我应用变换或以其他方式调整 CALayer 的大小时,我需要 CATextLayer 在其父级的边界内调整大小。调整大小时,CAText
我想使用 CATextLayer 以 NSAttributedString 的形式显示一些部分加粗的文本 - 但仍然想使用 IB 的便利性进行定位。 有没有办法通过界面生成器放入 CATextLaye
我正在尝试构建一个自定义控件,它可能看起来像这个 Inkscape 模型: 我正在使用 drawRect() 做一些事情,但我需要为一些元素设置动画,所以我决定切换到 CALayer 的组合。我一直在
上图显示了一个红色的 CATextLayer 框架。 当我增加文本字体大小时,文本超出框架。 我正在使用捏合手势来增加字体大小。我想获取 CATextLayer 中文本的大小,以便在文本框架超出图层框
我正在尝试将 CATextLayer 添加到 UITableViewCell。问题是文本呈现为黑色,而我已经设置了它的 foregroundColor。有人能告诉我我错过了什么吗?谢谢。 CAText
如果我包装了 == YES,有没有办法让 CATextLayer 显示“...”? 最佳答案 是的,设置 truncationMode = kCATruncationEnd。它默认为 kCATrunc
这应该真的有效,但不是: CATextLayer* textLayer = [CATextLayer layer]; textLayer.string = @"text"; [textLayer se
我有与 question 相关的问题 我设置了 contentsScale 之后,文本看起来不错,但如果我应用 3d 旋转变换,文本就会变得模糊。 图片 here 初始化代码 // init
我希望我的文本被白色边框包围。我正在使用 CATextLayer 作为文本。我知道 CATextLayer 没有属性 borderColor/borderWidth。当然,我可以使用它的父类(supe
我正在尝试修改图层中文本的字体属性,但没有成功。有人可以帮忙吗?请在下面找到代码: - (id)initWithFrame:(CGRect)frame { self = [super init
我想为我的图像创建一个文本叠加层。问题是,如果我尝试添加第二个文本,比如字幕,它会忽略我的字体大小。 titleLayer.frame = CGRectMake(0, 80, imageVie
我正在尝试对 CATextLayer 的字符串属性进行动画处理,以便我可以使用 AV Foundation 在我的视频中添加时间戳。有谁知道如何设置动画以便我可以每秒更改字符串值? 最佳答案 NSSt
我想画一个这样的列表: 1. List item 1 2. List item 2 3. List item 3 这是我的代码: NSTextList *list = [[NSTextList
我是一名优秀的程序员,十分优秀!