我有一个UILabel我想在顶部和底部添加空间的地方。使用约束中的最小高度,我将其修改为:
UILabel
为此,我使用了:
override func drawTextInRect(rect: CGRect) { var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets)) }
但是我必须找到一种不同的方法,因为如果我写了两行以上,问题是一样的:
如果您想坚持使用 UILabel,而不是对其进行子类化,已经为您提供了明确的解决方案。
您可以从 IB 正确执行此操作:
如果您愿意避免使用 UIView 包装 UILabel,则可以使用 UITextView 来启用 UIEdgeInsets(填充)或子类 UILabel 以支持 UIEdgeInsets。
使用 UITextView 只需要提供插图(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 提供 TOP、LEFT、BOTTOM 和 RIGHT 的插入变量。
示例代码可以是:
在 .h (Objective-C)
float topInset, leftInset,bottomInset, rightInset;
在.m(目标-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 text margin