使用UITextBorderStyleNone设置UITextField的内边距

418

我想为我的UITextFields使用自定义背景。虽然这样可以工作得很好,但问题是我必须使用UITextBorderStyleNone才能使其看起来漂亮。这将强制文本紧贴左侧且没有填充。

我是否可以手动设置填充,以使其外观类似于UITextBorderStyleRoundedRect,而不使用自定义背景图像?

32个回答

12

您不能设置填充。相反,可以使用一个 UIView,其中包含您的背景图像和UITextField。将UITextField的宽度设置为UIViewWidth-(paddingSize x 2),高度同样如此,然后将其设置在点 paddingSize,paddingSize


11

只需像这样子类化UITextFieldSwift版本):

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点的水平填充。


8

我基于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];
}

7

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)
    }
}

6

设置UITextField的UITextBorderStyleNone填充: Swift

根据@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]];
}

现在我可以在(viewDidLoad方法)内调用该方法,并将任何一个文本框发送到该方法中,通过编写一行代码即可为右侧和左侧添加填充,并设置文本和背景颜色,如下所示:
[self modifyTextField:self.firstNameTxtFld];

这个方法在iOS 7上完美运行!我知道添加太多视图可能会使这个类的负担更重。但是当考虑到其他解决方案的困难时,我发现自己更倾向于这种方法,并更加灵活地使用这种方式。;)
感谢“Evil Trout”提供的技巧!(鞠躬)
我认为我应该用Swift更新这个答案的代码段:
由于Swift允许我们为现有类编写扩展,因此让我们以这种方式编写它。
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()

希望这对其他人有所帮助!
祝福!

5

Swift 2.0版本:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;

5
以下是如何在 SWIFT 中实现这一点的方法。
@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
}
}

Resource


5
如果有人在寻找Swift 4.0版本,那么下面的扩展功能可以使用。它针对UITextField具有左右填充。实际上是为了StoryBoard配置而设置的IBInspectable。您可以直接从Interface Builder / Storyboard中设置值。这是在Swift 4.0版本和Xcode 9.0中测试过的代码。
请记住,如果您要在同一个UITextField上启用Clear Button,则必须将Right Padding保留为空白。
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     
        }
    }
}  

4

对于那些通过编程创建界面的人来说,^ 这些建议非常有用。

但对于我们这些使用Xcode界面构建器的人来说,有两种懒惰简单的方法:

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

  • 最简单的方法:将边框样式更改为简单的黑色正方形(从左边数第二个选项),然后将图像添加为背景图像。 图像优先于正方形,因此您仍然可以获得普通图像背景所需的填充,而不会实际绘制正方形。

编辑:您还可以使用黑色球体(在IB中选择UITextBox时从左数第三个选项),它无法与最右边的“图形球体”样式配合使用。


你的简单解决方案确实在某些情况下是一个有效的选择,但你最简单的解决方案是一种hack,而且如果你的图像边缘像素具有可变的alpha值,它也无法工作(更不用说苹果可能会在未来的iOS版本中改变他们的实现方式)。 - jmdecombe
我不不同意你的看法——这就是为什么我把“懒惰的简单方法”用大写字母标出来的原因。 到目前为止,它对我很有效。 - woody121

3
最好的方法是使用UITextField的子类来创建一个类,并在.m文件中进行操作。
 #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添加填充,则你的应用程序将无法运行,并且只会显示空白屏幕。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接