如何防止文本笔划在UILabel边缘切断?

时间:2013-04-05 15:15:27

标签: objective-c uilabel core-text stroke

我在UILabel中为文本添加了几个像素的相当宽的笔划,并且根据行间距,如果文本的边缘触摸标签的边缘,则边缘如果它们超出标签的范围,则可以切断笔划。 如何防止这种情况?以下是我用于应用笔画的代码(目前为5px):

- (void) drawTextInRect: (CGRect) rect
{
    UIColor *textColor = self.textColor;

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(c, 5);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetTextDrawingMode(c, kCGTextStroke);
    self.textColor = [UIColor colorWithRed: 0.165 green: 0.635 blue: 0.843 alpha: 1.0];
    [super drawTextInRect: rect];
}

以下是标签侧面剪裁的示例,我认为需要发生的事情之一是:

  • 当文本分成多行时,标签框架内会给出一些空间,以便占用笔划。
  • 或者,允许笔划溢出标签的外边界。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:3)

是的,裁剪只是没有用。

但是,如果您在UILabel子类上创建插图,该怎么办?你需要制作标签的框架,然后设置你的插图。当您绘制文本时,它将使用insets为您提供所需边缘的填充。

缺点是,您无法在IB中一眼判断换行。你必须拿走你的标签并减去你的插图,然后你会看到它在屏幕上看起来真的如何。

·H

@interface MyLabel : UILabel
@property (nonatomic) UIEdgeInsets insets;
@end

的.m

@implementation MyLabel

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.insets = UIEdgeInsetsMake(0, 3, 0, 3);
    }

    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSaveGState(c);

    CGRect actualTextContentRect = rect;
    actualTextContentRect.origin.x += self.insets.left;
    actualTextContentRect.origin.y += self.insets.top;
    actualTextContentRect.size.width -= self.insets.right;
    actualTextContentRect.size.height -= self.insets.bottom;

    CGContextSetLineWidth(c, 5);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetTextDrawingMode(c, kCGTextStroke);
    self.textColor = [UIColor colorWithRed: 0.165 green: 0.635 blue: 0.843 alpha: 1.0];

    [super drawTextInRect:actualTextContentRect];
    CGContextRestoreGState(c);
    self.textColor = [UIColor whiteColor];
    [super drawTextInRect:actualTextContentRect];
}

Simulator run

修改:为我的UILabel子类添加了完整代码。稍微修改了代码以显示大笔划和正常字母。

答案 1 :(得分:1)

您应该在sizeThatFits:子类上实现UILabel以返回稍大的首选大小,并考虑笔划所需的额外空间。然后,您可以使用sizeThatFits:的结果正确计算标签的框架,或者只需拨打sizeToFit