rdu*_*and 6 objective-c line-breaks uilabel ios
当我创建了一个UILabel与textAlignement设置为NSTextAlignmentCenter,lineBreakMode到NSLineBreakByWordWrapping和长文本,它分裂是这样的:
+------------------------------------+
| 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)
当然,我不想手动处理换行符。我希望标签自动平衡线条,使它们的长度尽可能接近。
我遇到了同样的问题,并受到这个问题的启发,我通过覆盖找到了解决方案
- (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、评论!
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |