我想为我的UITextFields
使用自定义背景。虽然这样可以工作得很好,但问题是我必须使用UITextBorderStyleNone
才能使其看起来漂亮。这将强制文本紧贴左侧且没有填充。
我是否可以手动设置填充,以使其外观类似于UITextBorderStyleRoundedRect
,而不使用自定义背景图像?
我想为我的UITextFields
使用自定义背景。虽然这样可以工作得很好,但问题是我必须使用UITextBorderStyleNone
才能使其看起来漂亮。这将强制文本紧贴左侧且没有填充。
我是否可以手动设置填充,以使其外观类似于UITextBorderStyleRoundedRect
,而不使用自定义背景图像?
您不能设置填充。相反,可以使用一个 UIView
,其中包含您的背景图像和UITextField
。将UITextField
的宽度设置为UIViewWidth-(paddingSize x 2)
,高度同样如此,然后将其设置在点 paddingSize,paddingSize
。
只需像这样子类化UITextField(Swift版本):
import UIKit
class CustomTextField: UITextField {
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds, 25.0, 0)
}
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return self.textRectForBounds(bounds)
}
}
这会在左右两侧添加25.0点的水平填充。
我基于Nate的解决方案,但是后来发现在使用leftView/rightView属性时会出现问题,因此更好的方法是调整父类的实现,因为它会考虑到left/right view。
- (CGRect)textRectForBounds:(CGRect)bounds {
CGRect ret = [super textRectForBounds:bounds];
ret.origin.x = ret.origin.x + 5;
ret.size.width = ret.size.width - 10;
return ret;
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return [self textRectForBounds:bounds];
}
Swift 3的更新版本:
@IBDesignable
class FormTextField: UITextField {
@IBInspectable var paddingLeft: CGFloat = 0
@IBInspectable var paddingRight: CGFloat = 0
override func textRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: bounds.origin.x + paddingLeft, y: bounds.origin.y, width: bounds.size.width - paddingLeft - paddingRight, height: bounds.size.height)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
}
根据@Evil Trout的最受欢迎的答案,我在我的ViewController类中创建了一个自定义方法,如下所示:
- (void) modifyTextField:(UITextField *)textField
{
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
textField.rightView = paddingView;
textField.rightViewMode = UITextFieldViewModeAlways;
[textField setBackgroundColor:[UIColor whiteColor]];
[textField setTextColor:[UIColor blackColor]];
}
[self modifyTextField:self.firstNameTxtFld];
extension UITextField {
func addPaddingToTextField() {
let paddingView: UIView = UIView.init(frame: CGRectMake(0, 0, 8, 20))
self.leftView = paddingView;
self.leftViewMode = .Always;
self.rightView = paddingView;
self.rightViewMode = .Always;
self.backgroundColor = UIColor.whiteColor()
self.textColor = UIColor.blackColor()
}
}
使用方法:
self.firstNameTxtFld.addPaddingToTextField()
Swift 2.0版本:
let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;
@IBOutlet weak var yourTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let paddingView = UIView(frame: CGRectMake(0, 0, 10, self.yourTextField.frame.height))
yourTextField.leftView = paddingView
yourTextField.leftViewMode = UITextFieldViewMode.Always
}
}
import UIKit
extension UITextField {
@IBInspectable var paddingLeft: CGFloat {
get {
return leftView!.frame.size.width
}
set {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
leftView = paddingView
leftViewMode = .always
}
}
@IBInspectable var paddingRight: CGFloat {
get {
return rightView!.frame.size.width
}
set {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
rightView = paddingView
rightViewMode = .always
}
}
}
对于那些通过编程创建界面的人来说,^ 这些建议非常有用。
但对于我们这些使用Xcode界面构建器的人来说,有两种懒惰简单的方法:
更简单:在文本字段后面放置UIImageView
最简单的方法:将边框样式更改为简单的黑色正方形(从左边数第二个选项),然后将图像添加为背景图像。 图像优先于正方形,因此您仍然可以获得普通图像背景所需的填充,而不会实际绘制正方形。
编辑:您还可以使用黑色球体(在IB中选择UITextBox时从左数第三个选项),它无法与最右边的“图形球体”样式配合使用。
#import "CustomTextField.h"
#import <QuartzCore/QuartzCore.h>
@implementation CustomTextField
- (id)initWithCoder:(NSCoder*)coder
{
self = [super initWithCoder:coder];
if (self) {
//self.clipsToBounds = YES;
//[self setRightViewMode:UITextFieldViewModeUnlessEditing];
self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
self.leftViewMode=UITextFieldViewModeAlways;
}
return self;
}
通过这样做,进入你的Storyboard或Xib,点击"Identity Inspector",并在类选项中将UITextfield替换为你自己的"CustomTextField"。
注意:如果你只是使用自动布局为textfield添加填充,则你的应用程序将无法运行,并且只会显示空白屏幕。