iOS将左侧填充添加到UILabel

时间:2013-10-17 21:24:26

标签: ios uilabel

我需要创建一个带有背景颜色的UILabel,我想添加一些左边的填充,但我在这里找到的每个解决方案看起来都像是一个讨厌的黑客。

从iOS 5开始实现这一目标的“标准”方式是什么?

修改

用于说明我的方案的屏幕截图.-

enter image description here

13 个答案:

答案 0 :(得分:94)

有关可用解决方案的完整列表,请参阅以下答案: UILabel text margin


尝试继承UILabel,就像@Tommy Herbert在[this question] [1]的回答中所建议的那样。为方便起见,复制并粘贴:

我通过继承UILabel并覆盖drawTextInRect来解决这个问题:像这样:

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

答案 1 :(得分:24)

也为字符串添加空格字符。那个可怜人的填充物:)

OR

我会选择自定义背景视图,但如果您不想这样,那么空间是我看到的唯一其他简单选项......

或写一个自定义标签。通过coretext

呈现文本

答案 2 :(得分:24)

我知道这是旧的,但对后人来说..

最重要的部分是你必须覆盖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))
}

答案 3 :(得分:23)

#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

答案 4 :(得分:16)

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];

答案 5 :(得分:15)

有时使用UNICODE部分空间在原型设计时实现对齐非常方便。这在原型设计,概念验证或仅推迟图形算法的实现方面非常方便。

如果为方便起见使用UNICODE空格,请注意至少有一个UNICODE空格的大小基于它显示的字体,特别是实际空格字符本身(U + 0020,ASCII 32)

如果您在UILabel中使用默认的iOS系统字体,则默认的系统字体特征可能会在后续iOS版本中发生变化,并通过更改应用程序的精确间距突然引入不必要的错位。这可能而且确实会发生,例如旧金山" font替换了iOS版本中以前的iOS系统字体。

UNICODE易于在Swift中指定,例如:

let six_per_em_space = "\u{2006}"

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

注意:附加图片是一个截图,不是 HTML,因此如果您想要剪切/粘贴空间,请访问linked page

UNICODE spaces

答案 6 :(得分:4)

我在这里遇到了一些问题,例如当你在填充中添加时,内容的宽度溢出了框,我想要一些角半径。我使用以下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 ;

答案 7 :(得分:2)

我克服这个问题的一件事是使用UIButton而不是UILabel。然后在Interface Builder的Attributes Inspector中,我使用Edge作为标题作为填充 如果您没有将按钮附加到某个操作,则单击时它将不会被选中,但仍会显示突出显示。

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

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

这种方法给出了相同的结果,但有时由于某些原因我没有调查,因为我可以使用Interface Builder。

这仍然是一种解决方法,但如果突出显示不会给您带来麻烦,它会很有效。希望它有用

答案 8 :(得分:1)

继承UILabel并覆盖drawTextInRect:像这样:

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

答案 9 :(得分:1)

如果您想要将填充添加到UILabel但不想将其子类化,则可以将标签放在UIView中,并为自动布局提供填充,例如:

Padding with UIView and autolayout

结果:

Result

答案 10 :(得分:1)

雨燕5

创建以下课程文件,并通过情节提要将其设置为您的标签,作为自定义课程名称。就是这样。

class PaddingLabel: UILabel {

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)//CGRect.inset(by:)
        super.drawText(in: rect.inset(by: insets))
    }
}

答案 11 :(得分:0)

使用CocoaPods安装

pod 'PaddingLabel', '1.2'

将您的UILabel类更改为PaddingLabel ### Example

指定填充

enter image description here

答案 12 :(得分:-1)

如果您需要比文本左侧添加空格更具体的文本对齐方式,您可以随时添加第二个空白标签,其中包含您需要多少缩进。

我的按钮文本左对齐,缩进10px,下面需要一个标签才能排成一行。 它给标签带有文字和左对齐,并将其放在x = 10,然后制作一个相同背景颜色的小第二个标签,宽度= 10,并在真实标签旁边排列。

最小的代码,看起来不错。 让AutoLayout更麻烦一点让所有事情都有效。

相关问题