如何在iPhone应用程序中实现UIButton / UILabel'填充'

我有我的iPhone应用程序中需要填充的各种意见,例如一个自定义的UIButton左alignment的文本和UILabel与背景颜色。

这可能是一个非常愚蠢的问题,但我怎样才能应用“填充”从左边移动文本?

我已经厌倦了使用边界等没有任何成功。

我知道我可以用背景颜色为我的UILabel创build一个包装视图,但看起来像是过度杀伤。

非常感谢。

我正在使用自动布局 。 解决scheme为我工作是设置UIButtoncontentEdgeInsets

ObjC

 button.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 30.0f, 0.0f, 30.0f); 

迅速

 button.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 30.0, bottom: 0.0, right: 30.0) 

这里戴夫解释如何添加填充到UIButton标题,希望这有助于。 他使用UIButton上的titleEdgeInsets属性。

好吧,我发现迄今为止最简单的解决scheme是:

 self.textAlignment = UITextAlignmentCenter; [self sizeToFit]; CGRect frame = self.frame; frame.size.width += 20; //l + r padding self.frame = frame; 

不完全是我想要的,但它的作品。

要在uibutton文本中设置填充,您需要使用UIButton的contentEdgeInsets属性。 在Storyboard中,要设置内容embedded,请执行以下步骤:

  1. select视图控制器,selectuibutton
  2. 进入实用程序面板(Command + Option + 0)并select属性检查器(Command + Option + 4)
  3. 现在selectEdge中的 内容并按照您的要求设置Inset (见屏幕截图)

在这里输入图像说明

要将填充添加到UILabel,最灵活的方法是inheritanceUILabel并添加edgeInsets属性。 然后设置所需的插图,标签将相应地绘制。

OSLabel.h

 #import <UIKit/UIKit.h> @interface OSLabel : UILabel @property (nonatomic, assign) UIEdgeInsets edgeInsets; @end 

OSLabel.m

 #import "OSLabel.h" @implementation OSLabel - (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0); } return self; } -(id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if(self){ self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0); } return self; } - (void)drawTextInRect:(CGRect)rect { return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)]; } @end 

CGRectInset是你的朋友。 你可以设置消极的'insets'来创build填充:

 [self sizeToFit]; CGRect rect = self.frame; rect = CGRectInset( rect, -6.f, -5.f); // h inset, v inset self.frame = rect; 

这是UILabel的一个子类,它使用edgeInset属性来定制填充:

PaddedLabel.h

 #import <UIKit/UIKit.h> @interface PaddedLabel : UILabel @property UIEdgeInsets edgeInsets; @end 

PaddedLabel.m

 #import "PaddedLabel.h" @implementation PaddedLabel -(void)drawTextInRect:(CGRect)rect { return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)]; } -(CGSize)intrinsicContentSize { CGSize contentSize = [super intrinsicContentSize]; UIEdgeInsets insets = self.edgeInsets; contentSize.height += insets.top + insets.bottom; contentSize.width += insets.left + insets.right; return contentSize; } @end 

(这是布罗迪的答案的简化,也适用于自动布局。)

我正在尝试实现类似的事情,那就是“打”一个UILabel 。 我一直在试图实现Toby上面所提到的解决scheme,但似乎无法find需要去的地方。 我正在使用的UILabel是左alignment – 这是什么原因造成的问题?

我已经尝试在viewDidLoad使用这个,甚至在UILabel的子类中的方法:

 - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 

如果你只是在一条线上寻找水平的填充,那么这可能就足够了(这对我来说):

 NSString* padding = @" "; // 2 spaces myLabel.text = [NSString stringWithFormat:@"%@%@%@", padding, name, padding];