How to achieve UIButton / UILabel 'padding' in iPhone app

IphoneUiviewUibuttonUilabelPadding

Iphone Problem Overview


I've got various views in my iPhone application that require padding e.g a custom UIButton with text aligned left, and a UILabel with a background color.

This may be a really stupid question, but how can I apply 'padding' to move the text off the left hand edge?

I've tired using bounds etc without any success.

I know I could create a wrapper view for my UILabel with a background color, but it seems like overkill.

Many thanks.

Iphone Solutions


Solution 1 - Iphone

I am using auto layout. Solution that worked for me was setting UIButton's contentEdgeInsets.

###ObjC

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

###Swift

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

Solution 2 - Iphone

Ok the simplest solution I've found so far is:

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

Not exactly what I wanted, but it works.

Solution 3 - Iphone

To set padding in UIButton text you need to use UIButton's contentEdgeInsets property.

In Storyboard, to set content inset do following steps:

  1. Select the view controller, then select the UIButton
  2. Go to Utilities Panel (Command + Option + 0) and select Attributes Inspector (Command + Option + 4)
  3. Now select Content in Edge and set Inset as per your requirement (see screenshot)

enter image description here

Solution 4 - Iphone

To add padding to UILabel the most flexible approach is to subclass UILabel and add an edgeInsets property. You then set the desired insets and the label will be drawn accordingly.

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

Solution 5 - Iphone

On Xcode 9, the insets are now located in the Size Inspector instead of the Attributes Inspector:

Xcode 9 Size Inspector - Button insets

Solution 6 - Iphone

Here's a sublass of UILabel that has customizable padding using an edgeInset property:

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

(This is a simplification of Brody's answer which also works with autolayout.)

Solution 7 - Iphone

CGRectInset is your friend. You can set negative 'insets' to create padding:

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

Solution 8 - Iphone

I'm trying to achieve a similar thing, that is 'pad' a UILabel. I've been trying to implement the solution that Toby posted above, but can't seem to find where this needs to go. The UILabel I'm working with is aligned left - is that what's causing the issue?

I've tried using this in viewDidLoad, and even in a subclass of UILabel in the method:

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

Solution 9 - Iphone

What about creating a custom class that extends UIButton and overriding this:

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    return UIEdgeInsetsInsetRect(contentRect, UIEdgeInsetsMake(topPadding, rightPadding, bottomPadding, leftPadding));
}

In the case of UILabel just override:

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

Solution 10 - Iphone

If you're just looking for a horizontal padding on one line, then this may be enough (it was for me):

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser210437View Question on Stackoverflow
Solution 1 - IphoneRafa de KingView Answer on Stackoverflow
Solution 2 - Iphoneuser210437View Answer on Stackoverflow
Solution 3 - IphoneGiru BhaiView Answer on Stackoverflow
Solution 4 - IphoneBrody RobertsonView Answer on Stackoverflow
Solution 5 - IphoneAlexView Answer on Stackoverflow
Solution 6 - IphoneJakob EggerView Answer on Stackoverflow
Solution 7 - IphonecleverbitView Answer on Stackoverflow
Solution 8 - IphoneAlan TaylorView Answer on Stackoverflow
Solution 9 - IphonePakitoVView Answer on Stackoverflow
Solution 10 - IphoneLukas KalinskiView Answer on Stackoverflow