如何在视图中绘制没有边距的字符串?

时间:2015-05-31 18:53:33

标签: ios string uiview uikit nsattributedstring

我无法在其视图中绘制一个没有边距的NSAttributedString。这是我的代码:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:72.0f]};
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"Hello"
                                                             attributes:attributes];
[string drawWithRect:rect
             options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics
             context:nil];

这会导致以下行为:

String drawn with margins

请注意左侧和顶部的边距。

  1. 如何避免这些边距并使文本完全符合包含视图的边缘?我想要的是实际绘制的文本与视图的边缘相交,也就是说,在任何字形中绘制的最顶部像素应该在视图的顶部,并且在任何字形中绘制的最左边的像素位于视图的左侧。观点。
  2. 假设1是可能的,有没有办法可以得到绘制文本的实际宽度和高度,这样我就可以计算字体大小和字距以使文本符合底部和右边缘?
  3. 我意识到可能有一些方法来对齐文本而不使其符合视图的边缘,但是使其符合视图的边缘将允许我使用自动布局等直观地处理视图。

    当字符串包含前导或尾随空格时,我不关心行为。

    如果使用NSAttributedString无法做到这一点,是否还有其他方法可以推荐您推荐的此行为?

    澄清一下,这就是我想看到的第1号。

    Desired behavior

3 个答案:

答案 0 :(得分:5)

您可以使用CoreText获取高度,宽度向量值:

var mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = mongoose.Schema.Types.ObjectId,
var Stamp = require('../models/stamp.js');

var User = new Schema({ 
    name: { type: String},

    stamps: [{ type: ObjectId, ref: 'Stamp' }],

所以你可以得到直肠。但最高利润没有错误

答案 1 :(得分:3)

使用CoreText,CTLineGetTypographicBounds()可能就是你要找的东西。我自己没有用过这个。下面的代码演示了这个想法(将“Hello”绘制到没有顶部/左边距的自定义UIView)。

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    UIGraphicsPushContext(context)

    let viewHeight = bounds.size.height

    let attributedString = NSAttributedString(string: "Hello")
    let line = CTLineCreateWithAttributedString(attributedString)
    var ascent: CGFloat = 0.0
    let width = CTLineGetTypographicBounds(line, &ascent, nil, nil)

    CGContextSaveGState(context)

    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextTranslateCTM(context, 0, -viewHeight)
    CGContextSetTextPosition(context, 0, viewHeight - ascent)
    CTLineDraw(line, context)

    CGContextRestoreGState(context)

    UIGraphicsPopContext()
}

答案 2 :(得分:1)

试试这个。

float fonsize = 30.0;
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:fonsize]};
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"HelloWorld"
                                                             attributes:attributes];
CGSize stringBoundingBox = [string.string sizeWithFont:[UIFont systemFontOfSize:fonsize]];
CGRect rect = CGRectMake(50, 50, stringBoundingBox.width,stringBoundingBox.height);

UILabel* lbl = [[UILabel alloc] initWithFrame:rect];
lbl.backgroundColor = [UIColor yellowColor];
lbl.attributedText = string;
[self.view addSubview:lbl];