views:

691

answers:

3

I'm trying to use a custom textfield background. The problem is that the text then appears to be too close on the left.

I don't see any way to shift the text without subclassing UITextField. So I'm attempting to extend and overwrite

- (void)drawTextInRect:(CGRect)rect{
    NSLog(@"draw rect");
    CGRect newRect = CGRectMake(rect.origin.x+20,rect.origin.y,rect.size.width-20,rect.size.height);    
    [super drawTextInRect:newRect]; 
}

But for some reason the log never prints. I know the subclass is being used since I also have a log in the init, and that prints fine.

Whast goig on

EDIT.

I also try

- (CGRect)textRectForBounds:(CGRect)bounds{
    NSLog(@"bounds");
    CGRect b = [super textRectForBounds:bounds];
    b.origin.x += 20;
    return b;
}

That actually traces, but it doesn't seem to be shifting

+3  A: 

I think you could use the leftView property for this.

You can add a leftView and rightView to a UITextfield. These views can be used to display an icon, but if it's an empty view it'll just take up space, which is what you want.

CGFloat leftInset = 5.0f;
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, leftInset, self.bounds.size.height)];
self.leftView = leftView;
self.leftViewMode = UITextFieldViewModeAlways;
[leftView release];
Thomas Müller
that doesn't solve why what I was doing wasn't working, but sure solves my problem. Thanks! I actually tried the same, but left out the viewModeAlways, thus it didn't work.
dizy
+4  A: 

Just FYI, but I had the same problem and finally realized that there's also a editingRectForBounds: method. The control uses that one when you're initially typing stuff into the field. If it has a value and is no longer in editing mode, it then uses textRectForBounds: to decide where to draw the text.

Sean
that worked well for me, thanks for the clarification.
Felix
A: 

I've not tried Thomas's method, but just to clarify Sean's answer, this has worked for me:

MyInsetUITextField.m

#import "MyInsetUITextField.h"
@implementation MyInsetUITextField

- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset(bounds, 10, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds, 10, 0);
}

@end

MyInsetUITextField.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MyInsetUITextField : UITextField {

}

@end

Thanks.

gef