如果您想坚持使用UILabel而不对其进行子类化,则Mundi为您提供了明确的解决方案。
或者,如果您愿意避免用UIView包裹UILabel,则可以使用UITextView启用UIEdgeInsets(填充)或UILabel子类的使用以支持UIEdgeInsets。
使用UITextView仅需要提供插图(OBJ-C):
textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);
或者,如果您将UILabel子类化,则此方法的一个示例将是重写drawTextInRect方法
(OBJ-C)
- (void)drawTextInRect:(CGRect)uiLabelRect {
UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}
您还可以为新的子类UILabel提供用于TOP,LEFT,BOTTOM和RIGHT的插入变量。
示例代码可能是:
在.h(OBJ-C)中
float topInset, leftInset,bottomInset, rightInset;
以.m(OBJ-C)
- (void)drawTextInRect:(CGRect)uiLabelRect {
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}
编辑#1:
从我所看到的情况来看,子类化时似乎必须重写UILabel的internalContentSize。
因此,您应该像下面那样覆盖internalContentSize:
- (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的大小以匹配边缘插图,并覆盖您引用的多行必要性。
编辑#2
经过一番搜索后,我发现了带有IPInsetLabel的Gist。如果这些解决方案均无效,则可以尝试一下。
编辑#3
关于此事,存在类似的问题(重复)。
有关可用解决方案的完整列表,请参见以下答案:UILabel文本边距