ios 缩进 UITextField 中的文本
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7565645/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Indent the text in a UITextField
提问by Dyldo42
My question is as simple as the title, but here's a little more:
我的问题和标题一样简单,但这里还有一点:
I have a UITextField, on which I've set the background image. The problem is that the text hugs so closely to it's edge, which is also the edge of the image. I want my text field to look like Apple's, with a bit of horizontal space between the background image and where the text starts.
我有一个 UITextField,我在上面设置了背景图像。问题是文本与它的边缘非常接近,这也是图像的边缘。我希望我的文本字段看起来像 Apple 的,在背景图像和文本开始位置之间有一点水平空间。
回答by adjwilli
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.Always
textField.leftView = spacerView
回答by Jano
You have to subclass and override textRectForBounds: and editingRectForBounds:. Here is a UITextfield subclass with custom background and vertical and horizontal padding:
您必须子类化并覆盖 textRectForBounds: 和editingRectForBounds:。这是一个带有自定义背景和垂直和水平填充的 UITextfield 子类:
@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];
回答by Brody Robertson
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.
向 UITextField 添加填充的一个好方法是继承 UITextField ,覆盖矩形方法并添加 edgeInsets 属性。然后,您可以设置 edgeInsets 并相应地绘制 UITextField。这也可以使用自定义的 leftView 或 rightView 集正常运行。
OSTextField.h
OSTextField.h
#import <UIKit/UIKit.h>
@interface OSTextField : UITextField
@property (nonatomic, assign) UIEdgeInsets edgeInsets;
@end
OSTextField.m
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
回答by Oxcug
I turned this into a nice little extension for use inside Storyboards:
我把它变成了一个很好的小扩展,可以在 Storyboards 中使用:
public extension UITextField {
@IBInspectable public var leftSpacer:CGFloat {
get {
if let l = leftView {
return l.frame.size.width
} else {
return 0
}
} set {
leftViewMode = .Always
leftView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
}
}
}
回答by Chris Prince
My 2 cents:
我的 2 美分:
class PaddedTextField : UITextField {
var insets = UIEdgeInsets.zero
var verticalPadding:CGFloat = 0
var horizontalPadding:CGFloat = 0
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: bounds.origin.x + insets.left, y: bounds.origin.y + insets.top, width: bounds.size.width - (insets.left + insets.right), height: bounds.size.height - (insets.top + insets.bottom));
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
}
回答by user790072
I suggest converting your UITextField
to a UITextView
and setting the contentInset
. For example to indent by 10 spaces:
我建议将您的转换UITextField
为 aUITextView
并设置contentInset
. 例如缩进 10 个空格:
textview.contentInset=UIEdgeInsetsMake(0, 10, 0, 0);
回答by Lirik
Sometimes the leftView of the textField is a Apple's magnifying glass image. If so, you can set an indent like this:
有时 textField 的 leftView 是 Apple 的放大镜图像。如果是这样,您可以像这样设置缩进:
UIView *leftView = textField.leftView;
if (leftView && [leftView isKindOfClass:[UIImageView class]]) {
leftView.contentMode = UIViewContentModeCenter;
leftView.width = 20.0f; //the space you want indented.
}
回答by Vrutin Rathod
If you don't want to create @IBOutlet's could simply subclass (answer in Swift):
如果您不想创建@IBOutlet,则可以简单地创建子类(Swift 中的答案):
class PaddedTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
let spacerView = UIView(frame:CGRect(x: 0, y: 0, width: 10, height: 10))
leftViewMode = .always
leftView = spacerView
}
}