我正在尝试使用从Adobe Font Collection Pro Package获得的 Helvetica Neue Condensed 字体。不幸的是,当我在UILabel
中使用它时,它似乎绘制不正确。
行高似乎是正确计算的(我认为),但是当显示字体时,它会与边界框的最顶部对齐。我调用[myLabel sizeToFit]
并仅调整宽度以产生此屏幕捕获:
我对字体的粗体和常规版本都有同样的问题。我能够从OSX中取出一个 Helvetica Neue Bold 的版本并将其放在我的设备上并显示正常(上图中的绿色背景)。
字体文件或我的代码导致它以这种方式绘制可能有什么问题?
答案 0 :(得分:120)
我发布了一个解决方案,涉及修补ttf字体文件here:
这是适用于我的自定义字体的解决方案,在UILabel,UIButton等中存在相同的问题。事实上,字体的问题是它的上升属性与系统字体的值相比太小了。 Ascender是字体字符上方的垂直空格。要修复字体,您必须下载Apple Font Tool Suite命令行实用程序。然后取出你的字体并执行以下操作:
~$ ftxdumperfuser -t hhea -A d Bold.ttf
这将创建Bold.hhea.xml
。使用文本编辑器打开它并增加ascender
属性的值。您将需要进行一些实验,以找出最适合您的确切值。在我的情况下,我将其从750更改为1200.然后使用以下命令行再次运行该实用程序,将您的更改合并回ttf文件:
~$ ftxdumperfuser -t hhea -A f Bold.ttf
然后在您的应用中使用生成的ttf字体。
答案 1 :(得分:64)
所以这是 kolyuchiy的答案的修改版本。
我用Glyphs打开了我的字体,然后导出它而不修改任何内容。不知何故,神奇地,垂直对齐问题消失了!
更好的是新字体与sizeWithFont:
等方法很好地配合,因此它没有 Joshua 提到的问题。
我用kolyuchiy提到的命令查看了HHEA表,并注意到Glyphs不仅修改了ascender
,还修改了lineGap
和numberOfHMetrics
。
以下是原始数据:
versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"
之后:
versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"
故事的寓意 - 不仅仅是增加上升者,还要修改其他相关价值观。
我不是排版专家所以我无法解释原因和方法。如果有人能提供更好的解释,我们将不胜感激! :)
答案 2 :(得分:31)
iOS 6尊重字体的lineGap属性,而iOS 7则忽略它。因此,只有线间距为0的自定义字体才能在两个操作系统中正常工作。
解决方案是使lineGap 0并使ascender相应更大。根据上面的answer,一种解决方案是从Glyphs导入和导出。但请注意,该应用的未来版本可能会修复此“错误”。
更强大的解决方案是按照post自行编辑字体。具体地,
ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
ascender
属性添加lineGap
属性的值来编辑lineGap
属性。例如,如果ascender
为200而ascender
为750,则设为lineGap
950。ftxdumperfuser -t hhea -A f YOUR_FONT.ttf
设置为0。执行此操作后,您可能需要相应地调整UI。
答案 3 :(得分:4)
答案 4 :(得分:4)
对于那些运行OS X El Capitan并进入此主题的人,您可能已经注意到Apple Font Tool Suite不再兼容(至少目前为止)。
但您仍然可以使用免费的字体编辑软件FontForge执行 kolyuchiy 和 Joseph Lin 所描述的更改。
使用FontForge打开字体并在顶部菜单中选择元素,然后转到字体信息> OS / 2>指标。在那里,您需要编辑HHEad线间隙和HHead Ascent Offset值。
完成必要的修改后,您只需在文件>中导出字体即可。生成字体并选择正确的字体格式
答案 5 :(得分:3)
我们的一种自定义字体遇到了同样的问题。我们还通过编辑字体ascender属性来“修复”问题。但是,我们发现这会产生其他问题和布局问题。例如,使用我们的上升编辑字体时,根据标签高度动态设置单元格高度会爆炸。
我们最终做的是更改UIButton contentEdgetInsets属性。
yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
不确定哪种方法更好,但只想分享另一种方法来解决问题。
答案 6 :(得分:3)
感谢这个answer我用Glyph修复了我的问题,但有点不同。
我用Glyphs打开我的字体(也可以使用Glyphs mini)并在那里找到这个部分(这来自Glyphs mini,在右上角按下i按钮):
只需删除所有这些对齐区域(或其中一些),它就可以解决此问题。 对我来说很完美。
答案 7 :(得分:1)
你试过Core Text吗?我通过Core Text渲染自定义字体有一些成功,但我不知道它是否适合你的情况。
答案 8 :(得分:1)
我曾经使用过https://github.com/fonttools/fonttools-非常易于使用且免费。在我的情况下,“ hhea”表中的“ ascender” = 1000和“ lineGap” = 0的更改可以解决问题。
根据Trevor Harmon https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae的文章
答案 9 :(得分:0)
如果您在使用这些命令行实用程序时遇到问题,请在窗口中尝试使用fontcreator。并从其设置菜单中更改字体组合。
答案 10 :(得分:0)
从您的标签文本创建属性文本对我来说是解决方法。继承人:
extension UILabel {
/// You can call with or without param values; without will use default 2.0
func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) {
guard let labelText = self.text else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
paragraphStyle.lineHeightMultiple = lineHeightMultiple
let attributedString:NSMutableAttributedString
if let labelattributedText = self.attributedText {
attributedString = NSMutableAttributedString(attributedString: labelattributedText)
} else {
attributedString = NSMutableAttributedString(string: labelText)
}
// (Swift 4.2 and above) Line spacing attribute
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
self.attributedText = attributedString
}
}
对于我的自定义字体,我从以下位置获得了所需的结果:
self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)
这可以通过使用本机提供的NSMutableParagraphStyle()
来实现,其中包含行高和间距属性(如果不对标签进行编程,也可以在情节提要中作为@IBOutlet
属性访问)。
答案 11 :(得分:0)
对于由于找不到命令错误而在Mac OS Mojave上努力使用.appbody{
min-height: calc(100vh - 65px);
margin-top: 65px; /* Clear the space for the app bar above */
}
(kolyuchiy答案)的任何人:
function App() {
const [list, setList] = useState([]);
const [name, setName] = useState('');
const [editIndex, setEditIndex] = useState(null);
const handleSubmit = () => {
if(editIndex) {
setList([...list.slice(0, index), name, ...list.slice(index+1)])
setEditIndex(null)
} else {
setList([...list, name]);
}
setName('')
}
return (
<div className="App">
<UserForm name={name} setName={setName} handleSubmit={handleSubmit}></UserForm>
<UserGrid setEditIndex={setEditIndex} list={list}></UserGrid>
</div>
);
}
),或将utils复制到您的bin中
文件夹。答案 12 :(得分:-2)
我在Sprite Kit游戏中遇到了与标志性“FontAwesome”字体类似的问题。 将SKLabelNode的SKLabelVerticalAlignmentMode属性设置为.Center对我有用。
myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
只是想分享一些人会遇到同样的问题。