如何在iPhone应用程序中实现UIButton / UILabel'填充'
我有我的iPhone应用程序中需要填充的各种意见,例如一个自定义的UIButton左alignment的文本和UILabel与背景颜色。
这可能是一个非常愚蠢的问题,但我怎样才能应用“填充”从左边移动文本?
我已经厌倦了使用边界等没有任何成功。
我知道我可以用背景颜色为我的UILabel
创build一个包装视图,但看起来像是过度杀伤。
非常感谢。
我正在使用自动布局 。 解决scheme为我工作是设置UIButton
的contentEdgeInsets
。
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,请执行以下步骤:
- select视图控制器,selectuibutton
- 进入实用程序面板(Command + Option + 0)并select属性检查器(Command + Option + 4)
- 现在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];