如果你想坚持使用UILabel,而不子类化它,Mundi已经给了你一个明确的解决方案。
如果你想避免用UIView来包装UILabel,你可以使用UITextView来支持UIEdgeInsets (padding)或者子类UILabel来支持UIEdgeInsets。
使用UITextView只需要提供insets (Objective-C):
textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);
另外,如果你子类化UILabel,这种方法的一个例子是重写drawTextInRect方法
(objective - c)
- (void)drawTextInRect:(CGRect)uiLabelRect {
UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}
您还可以为您的新子类UILabel提供带有insets变量的TOP, LEFT, BOTTOM和RIGHT。
一个示例代码可以是:
In .h (Objective-C)
float topInset, leftInset,bottomInset, rightInset;
在。m (Objective-C)中
- (void)drawTextInRect:(CGRect)uiLabelRect {
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}
从我所看到的,似乎你必须在子类化UILabel时重写它的intrinsicContentSize。
所以你应该像这样重写intrinsicContentSize:
- (CGSize) intrinsicContentSize {
CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
intrinsicSuperViewContentSize.height += topInset + bottomInset ;
intrinsicSuperViewContentSize.width += leftInset + rightInset ;
return intrinsicSuperViewContentSize ;
}
并添加以下方法来编辑您的嵌入,而不是单独编辑它们:
- (void) setContentEdgeInsets:(UIEdgeInsets)edgeInsets {
topInset = edgeInsets.top;
leftInset = edgeInsets.left;
rightInset = edgeInsets.right;
bottomInset = edgeInsets.bottom;
[self invalidateIntrinsicContentSize] ;
}
它将更新UILabel的大小,以匹配边缘插入并覆盖您提到的多行需求。
经过搜索,我找到了一个IPInsetLabel的Gist。如果这些方法都不起作用,你可以尝试一下。
关于这件事,还有一个类似的问题(重复)。
有关可用解决方案的完整列表,请参阅以下答案:UILabel文本边距