代码之家  ›  专栏  ›  技术社区  ›  Luke

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

  •  1
  • Luke  · 技术社区  · 11 年前

    我在一个 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 回复  |  直到 11 年前
        1
  •  3
  •   DBD    11 年前

    是的,剪辑不起作用。

    如果你在你的 UILabel 尽管如此,还是属于次类。你可以把标签的框架做成你需要的大小,然后设置你的插页。当你绘制文本时,它会使用插入来填充你需要的任何边缘。

    缺点是,你无法在IB中一眼就能判断线条的包裹。你必须取下你的标签,减去你的插页,然后你才能在屏幕上看到它真正的线条。

    .小时

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

    .米

    @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

    编辑: 添加了我的完整代码 UI标签 子类。稍微修改了代码,以显示大笔划和普通字体。

        2
  •  1
  •   Mike Weller    11 年前

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