在OSX绘制单行文本垂直居中

在iOS开发过程中,对单行文本的垂直居中似乎是一件非常easy的事情,直接用下面这段代码就可以完成:

123456789101112131415
@interface XXView : UIView@end

@implementation XXView

- (void)drawRect:(CGRect)rect{    UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:13];    NSDictionary *attributes = @{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor]};    NSAttributedString *title = [[NSAttributedString alloc] initWithString:@"我是垂直居中的"                                                                attributes:attributes];    [title drawAtPoint:CGPointMake(CGRectGetMidX(self.bounds)-title.size.width/2, CGRectGetMidY(self.bounds)-title.size.height/2)];}

@end

在OSX平台上,我们一般会这样写这段代码:

12345678910111213141516171819202122
@interface XXView : NSView@end

@implementation XXView

- (void)drawRect:(NSRect)dirtyRect{    [[NSColor redColor] set];    NSFrameRect(self.bounds);

    NSFont *font = [NSFont fontWithName:@"Helvetica Neue" size:13];    NSDictionary *attributes = @{NSFontAttributeName:font,NSForegroundColorAttributeName:[NSColor redColor]};    NSAttributedString *title = [[NSAttributedString alloc] initWithString:@"我位置有点儿偏下" attributes:attributes];

    NSSize txtSize = title.size;    NSPoint drawPoint = NSMakePoint(NSMidX(self.bounds)-txtSize.width/2, NSMidY(self.bounds)-txtSize.height/2);    

    [title drawWithRect:NSMakeRect(drawPoint.x, drawPoint.y, txtSize.width, txtSize.height)                options:NSStringDrawingUsesLineFragmentOrigin];}

@end

我们看到的效果将会是这样的:

这似乎并不符合预期,我尝试计算了NSFont的leading但仍然不能解决这个问题,经过对不同字体的对比,并绘制出NSAttributedString获得的size边框,就能发现NSFont在顶部总是会多出更多的空白区域,并且不仅仅只是字体leading所占用的区域.
知道问题之后,就算是找到了一个”曲线救国”解决办法,将原有的绘制方法改进为以下的代码:

1234567891011121314151617181920
- (void)drawRect:(NSRect)dirtyRect{    [[NSColor redColor] set];    NSFrameRect(self.bounds);

    NSFont *font = [NSFont fontWithName:@"Helvetica Neue" size:13];    NSDictionary *attributes = @{NSFontAttributeName:font,NSForegroundColorAttributeName:[NSColor redColor]};    NSAttributedString *title = [[NSAttributedString alloc] initWithString:@"我是垂直居中的" attributes:attributes];

    NSSize txtSize = title.size;    double topGap = txtSize.height - (font.ascender + fabs(font.descender));    NSPoint drawPoint = NSMakePoint(NSMidX(self.bounds)-txtSize.width/2, NSMidY(self.bounds)-txtSize.height/2);

    if ([self isFlipped])        drawPoint.y -= topGap/2;    else        drawPoint.y += topGap/2;

    [title drawAtPoint:drawPoint];}

最终可以获得我们预期的效果,并且支持flip模式:

时间: 2024-11-11 21:13:30

在OSX绘制单行文本垂直居中的相关文章

如何设置块级元素的单行文本垂直居中

这里有两个条件: ①文本要求是单行的 ②它的外部容器是一个块级元素 满足这两个条件之后,只需要设置文本的line-height等于外部块级元素的高度即可. 参照如下代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>单行文本垂直居中</title> <style> h2{ width: 3

如何让未知尺寸的图片、单行文本、多行文本水平垂直居中?

先看下效果图: 下面是CSS代码: <style type="text/css"> /*让未知尺寸的图片.单行文本.多行文本水平垂直居中*/ .wrap { border: 1px solid #0094ff; width: 200px; height: 200px; /*下面是实现垂直居中的关键,没有之一*/ display: table-cell; text-align: center; vertical-align: middle; } .wrap .subwrap

垂直居中-父元素高度确定的单行文本

我们在实际工作中也会遇到需要设置垂直居中的场景,比如好多报纸的文章标题在左右一侧时,常常会设置为垂直居中,为了用户体验性好. 这里我们又得分两种情况:父元素高度确定的单行文本,以及父元素高度确定的多行文本. 本节我们先来看第一种父元素高度确定的单行文本, 怎么设置它为垂直居中呢? 父元素高度确定的单行文本的竖直居中的方法是通过设置父元素的 height 和 line-height 高度一致来实现的.(height: 该元素的高度,line-height: 顾名思义,行高(行间距),指在文本中,行

垂直居中——父元素高度确定的单行文本、父元素高度确定的多行文本

声明:来自http://www.imooc.com/learn/9 学习 父元素高度确定的单行文本的竖直居中 是通过设置父元素的 height 和 line-height 高度一致来实现的. .container{ height:100px; line-height:100px; background:#999; } 父元素高度确定的多行文本 使用插入 table (包括tbody.tr.td)标签,同时设置 vertical-align:middle. <body> <table>

为什么只设置line-height就可以实现文本垂直居中效果

为什么只设置line-height就可以实现文本垂直居中效果:在实际应用中,如果让单行文本在元素中垂直居中,可以将元素的高度和行高值设置为相同即可.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> &l

单行文本如何转换为多行文本?

我们在日常的CAD绘图工作中,常常会遇到现有的文字文本不满足新的CAD制图修改工作,需要再次进行编辑修改.例如,为了更加精准地绘图修改,我们常常需要把单行文本转换为多行文本.今天小编就给大家分享一些文本编辑的一些小方法.具体操作如下: 单行文本 在专业的制图软件--迅捷CAD编辑器专业版里操作如下: 1.点击单行文字编辑图标,按照相应的命令指示,我们输入一串单行文本文字. 2.或是直接在命令框里输入"DTEXT"命令字符:按照相应的命令指示,我们输入一串单行文本文字. 单行文本到多行文

CAD图纸中如何添加一个单行文本

在CAD绘图的时候,在我们绘制的CAD图纸中,在有些特别的地方经常需要给图纸添加一些标注,那到底怎么在CAD图纸中给图纸添加标注了,那就需要添加一个单行文本.那CAD图纸中如何添加一个单行文本呢?下面小编就这个问题整理了一些方法现在分享给你们,下面我们就一起来看看吧! 步骤一:首先,小伙伴们在电脑中打开一个浏览器,然后在浏览器的搜索框中搜索迅捷CAD编辑器,在搜索的下拉栏中鼠标点击进入下载界面中,接着点击下载安装CAD编辑器到电脑上面进行使用就可以了. 步骤二:将该编辑器进行启动进入到使用界面中

单行文本和多行文本溢出显示省略号

1.单行文本 overflow: hidden; white-space: nowrap; //用于处理元素内的空白,只在一行内显示 text-overflow: ellipsis; //超过宽度使用省略号 2.多行文本 word-break: break-all; text-overflow: ellipsis; display: -webkit-box; //对象作为伸缩盒子模型显示          -webkit-box-orient: vertical; //设置或检索伸缩盒对象的子元

CSS实现多行文本溢出省略效果和单行文本溢出省略效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <title></title> <styl