1

我正在为 a 中的文本添加一个相当宽的几个像素的笔划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];
}

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

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

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

3

是的,剪辑只是没有用。

但是,如果您在UILabel子类上创建插图怎么办。您可以将标签的框架制作成您需要的大小,然后设置您的插图。当您绘制文本时,它将使用插图在您需要的任何边缘周围提供填充。

缺点是,您将无法在 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];
}

模拟器运行

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

于 2013-04-08T17:27:38.520 回答
1

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

于 2013-04-05T15:17:40.793 回答