平衡多行UILabel

rdu*_*and 6 objective-c line-breaks uilabel ios

当我创建了一个UILabeltextAlignement设置为NSTextAlignmentCenterlineBreakModeNSLineBreakByWordWrapping和长文本,它分裂是这样的:

+------------------------------------+
| Text that does not fit on a single |
|                line                |
+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

但是我真正想要的是这样的东西:

+------------------------------------+
|       Text that does not fit       |
|          on a single line          |
+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

当然,我不想手动处理换行符。我希望标签自动平衡线条,使它们的长度尽可能接近。

dev*_*jac 3

我遇到了同样的问题,并受到这个问题的启发,我通过覆盖找到了解决方案 - (void)drawTextInRect:(CGRect)rect

你可以在这个 GitHub 项目中看到它

如果您只想复制/读取方法本身,请在此处

- (void)drawTextInRect:(CGRect)rect {
    if (self.textAlignment == NSTextAlignmentCenter) {
        CGRect oneLineRect = [self textRectForBounds:CGRectInfinite limitedToNumberOfLines:1];
        NSInteger numberOfLines = ceil(oneLineRect.size.width / self.bounds.size.width);
        CGFloat betterWidth = (oneLineRect.size.width / numberOfLines);
        if (betterWidth < rect.size.width) {
            CGRect check = CGRectZero;
            do {
                betterWidth *= 1.1;
                CGRect b = CGRectMake(0, 0, betterWidth, CGRectInfinite.size.height);
                check = [self textRectForBounds:b limitedToNumberOfLines:0];
            } while (check.size.height > rect.size.height && betterWidth < rect.size.width);

            if (betterWidth < rect.size.width) {
                CGFloat difference = rect.size.width - betterWidth;
                rect = CGRectMake(rect.origin.x + difference/2.0, rect.origin.y, betterWidth, rect.size.height);
            }
        }
    }
    [super drawTextInRect:rect];
}
Run Code Online (Sandbox Code Playgroud)

欢迎 PR、fork、评论!