UITextField自定义背景视图和移动文本

时间:2009-12-08 04:01:28

标签: iphone uitextfield

我正在尝试使用自定义文本字段背景。问题是文本在左侧看起来太近了。

在没有子类化UITextField的情况下,我没有看到任何移动文本的方法。所以我试图扩展和覆盖

- (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]; 
}

但由于某种原因,日志永远不会打印。我知道子类正在被使用,因为我在init中也有一个日志,打印得很好。

What goig on

EDIT。

我也试试

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

这实际上是追踪,但它似乎没有移动

5 个答案:

答案 0 :(得分:14)

我认为您可以使用leftView属性。

您可以将leftViewrightView添加到UITextfield。这些视图可用于显示图标,但如果它是一个空视图,它只会占用空间,这就是你想要的。

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];

答案 1 :(得分:7)

另一个灵魂:

在你的appDelegate.m文件中,在顶部写下面的代码

@interface UITextField (myCustomTextField)

@end

@implementation UITextField (myCustomTextField)

- (CGRect)textRectForBounds:(CGRect)bounds {

    return CGRectInset(bounds, 10, 0);
}

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

@end

答案 2 :(得分:5)

仅供参考,但我遇到了同样的问题并最终意识到还有一个editingRectForBounds:方法。当您最初在字段中输入内容时,控件会使用该控件。如果它有一个值并且不再处于编辑模式,则它使用textRectForBounds:来决定在哪里绘制文本。

答案 3 :(得分:5)

我没有尝试过托马斯的方法,但只是为了澄清肖恩的答案,这对我有用:

<强> 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

感谢。

答案 4 :(得分:-1)

简而言之,对于我们这些使用Xcode界面构建器的人来说,有一种轻松的方式:

  • 更简单:将UIImageView放在文本字段后面

  • 最简单:将UITextView上的边框样式更改为除最右边&#34;图形圈&#34;以外的任何样式,然后添加图像作为背景。图像优先于图形,但仍然可以获得正常图像背景所需的填充。