iOS将左侧填充添加到UILabel

我需要创build一个背景颜色的UILabel ,我想添加一些左边的填充,但是我在这里find的每个解决scheme都像是一个讨厌的黑客。

从iOS 5中提前实现这个标准的方法是什么?

编辑

一个截图来说明我的情况。

在这里输入图像说明

有关可用解决scheme的完整列表,请参阅此答案: UILabel文本边距


尝试inheritanceUILabel,就像@Tommy Herbert在[这个问题] [1]的答案中所build议的那样。 复制和粘贴为了您的方便:

我通过inheritanceUILabel并重载drawTextInRect解决了这个问题:像这样:

 - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {0, 5, 0, 5}; [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 

string也加上一个空格字符。 这是可怜的男人的填充:)

要么

我会去一个自定义的背景视图,但如果你不想要的空间是唯一的其他简单的select,我看到…

或者写一个自定义标签。 通过coretext呈现文本

 #define PADDING 5 @interface MyLabel : UILabel @end @implementation MyLabel - (void)drawTextInRect:(CGRect)rect { return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, UIEdgeInsetsMake(0, PADDING, 0, PADDING))]; } - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines { return CGRectInset([self.attributedText boundingRectWithSize:CGSizeMake(999, 999) options:NSStringDrawingUsesLineFragmentOrigin context:nil], -PADDING, 0); } @end 

我知道这是旧的,但后代..

最重要的部分是,您必须重写intrinsicContentSize()和drawTextInRect()以解决AutoLayout

 var contentInset: UIEdgeInsets = .zero { didSet { setNeedsDisplay() } } override public var intrinsicContentSize: CGSize { let size = super.intrinsicContentSize return CGSize(width: size.width + contentInset.left + contentInset.right, height: size.height + contentInset.top + contentInset.bottom) } override public func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, contentInset)) } 

有时,使用UNICODE部分空间来实现原型devise时的alignment方便。 这在原型devise,概念validation或者延迟graphicsalgorithm的实现方面可以很方便。

如果您使用UNICODE空格以方便使用,请注意至less有一个UNICODE空格的大小基于它显示的字体,具体来说就是实际的空格字符本身(U + 0020,ASCII 32)

如果您在UILabel中使用默认的iOS系统字体,则默认的系统字体特征可能会在随后的iOS版本中发生变化,并通过更改应用的精确间距突然引入不必要的错位。 这可以发生,例如“旧金山”字体在iOS版本中取代了之前的iOS系统字体。

在Swift中很容易指定UNICODE,例如:

 let six_per_em_space = "\u{2006}" 

或者,将HTML页面中的空间直接剪切/粘贴到Interface Builder中的UILabel文本字段中。

注:附加的图片是一个截图, 而不是 HTML,所以如果你想剪切/粘贴空间,请访问链接的页面 。

UNICODE空间

 UIView* bg = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, 70)]; bg.backgroundColor = [UIColor blackColor]; UILabel* yourLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, y, yourWidth, yourHeight)]; [bg addSubview:yourLabel]; [self addSubview:bg]; 

我在这里有几个问题的答案,例如当你添加填充时,内容的宽度溢出框,我想要一些圆angular半径。 我解决了这个使用UILabel的以下子类:

 #import "MyLabel.h" #define PADDING 8.0 #define CORNER_RADIUS 4.0 @implementation MyLabel - (void)drawRect:(CGRect)rect { self.layer.masksToBounds = YES; self.layer.cornerRadius = CORNER_RADIUS; UIEdgeInsets insets = {0, PADDING, 0, PADDING}; return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } - (CGSize) intrinsicContentSize { CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ; intrinsicSuperViewContentSize.width += PADDING * 2 ; return intrinsicSuperViewContentSize ; } @end 

希望对某人有帮助! 请注意,如果你想填充顶部和底部,你需要改变这些行:

 UIEdgeInsets insets = {0, PADDING, 0, PADDING}; 

对此:

 UIEdgeInsets insets = {PADDING, PADDING, PADDING, PADDING}; 

在宽度下面加上这一行:

 intrinsicSuperViewContentSize.height += PADDING * 2 ; 

我做了一件事来克服这个问题是使用UIButton而不是UILabel。 然后在界面生成器的属性检查器中,我使用Edge作为标题作为填充。
如果您没有将该button附加到某个动作上,单击它时将不会被选中,但仍然会显示高亮。

您也可以使用以下代码以编程方式执行此操作:

 UIButton *mButton = [[UIButton alloc] init]; [mButton setTitleEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)]; [mButton setTitle:@"Title" forState:UIControlStateNormal]; [self.view addSubView:mButton]; 

这种方法给出了相同的结果,但有时它不起作用,因为如果可能我使用Interface Builder,我没有调查。

这仍然是一个解决方法,但如果突出显示不打扰您,它的工作原理相当不错。 希望它是有用的

inheritanceUILabel并覆盖drawTextInRect:像这样:

  - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {0, 10, 0, 0}; return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 

如果是单行,只需在左侧添加空格,多于一行的行将再次填充0。

 [self.myLabel setText:[NSString stringWithFormat:@" %@", @"Your string here"]]; 

如果你想添加填充到UILabel但不想子类,你可以把你的标签放在一个UIView并给自动布局填充,如:

用UIView和自动布局填充

结果:

结果

如果您需要更具体的文本alignment方式,而不是在文本左侧添加空格,则可以始终添加第二个空白标签,其中包含您需要的缩进量。

我有button左alignment的文本与缩进10px,需要下面的标签来查找行。 它给标签上的文字和左alignment,并把它放在x = 10,然后做了一个宽度相同的背景颜色为10的小的第二个标签,并排列在真正的标签旁边。

最小的代码,看起来不错。 只是让AutoLayout更麻烦一点,让一切工作。