Indent the text in a UITextField Indent the text in a UITextField ios ios

Indent the text in a UITextField


This is the quickest way I've found without doing any subclasses:

UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];[textfield setLeftViewMode:UITextFieldViewModeAlways];[textfield setLeftView:spacerView];

In Swift:

let spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10))textField.leftViewMode = UITextFieldViewMode.AlwaystextField.leftView = spacerView


You have to subclass and override textRectForBounds: and editingRectForBounds:. Here is a UITextfield subclass with custom background and vertical and horizontal padding:

@interface MyUITextField : UITextField @property (nonatomic, assign) float verticalPadding;@property (nonatomic, assign) float horizontalPadding;@end#import "MyUITextField.h"@implementation MyUITextField@synthesize horizontalPadding, verticalPadding;- (CGRect)textRectForBounds:(CGRect)bounds {    return CGRectMake(bounds.origin.x + horizontalPadding, bounds.origin.y + verticalPadding, bounds.size.width - horizontalPadding*2, bounds.size.height - verticalPadding*2);}- (CGRect)editingRectForBounds:(CGRect)bounds {    return [self textRectForBounds:bounds];}@end

Usage:

UIImage *bg = [UIImage imageNamed:@"textfield.png"];CGRect rect = CGRectMake(0, 0, bg.size.width, bg.size.height);MyUITextField *textfield = [[[MyUITextField alloc] initWithFrame:rect] autorelease];textfield.verticalPadding = 10; textfield.horizontalPadding = 10;[textfield setBackground:bg];[textfield setBorderStyle:UITextBorderStyleNone];[self.view addSubview:textfield];


A good approach to add padding to UITextField is to subclass UITextField , overriding the rectangle methods and adding an edgeInsets property. You can then set the edgeInsets and the UITextField will be drawn accordingly. This will also function correctly with a custom leftView or rightView set.

OSTextField.h

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

OSTextField.m

#import "OSTextField.h"@implementation OSTextField- (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;}- (CGRect)textRectForBounds:(CGRect)bounds {    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];}- (CGRect)editingRectForBounds:(CGRect)bounds {    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];}@end