14 ответов:
Это то, что я использую сейчас:
Swift 4
class TextField: UITextField { let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) override open func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override open func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override open func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } }Swift 3:
class TextField: UITextField { let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) override func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } }Я никогда не устанавливаю другую прокладку, но вы можете настроить. Этот класс не заботится о rightView и leftView в текстовом поле. Если вы хотите, чтобы это было правильно обработано, вы можете использовать что-то вроде (пример в objc, и мне нужен только rightView:
- (CGRect)textRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)placeholderRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)editingRectForBounds:(CGRect)bounds { CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets); if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeWhileEditing) { return [self adjustRectWithWidthRightView:paddedRect]; } return paddedRect; } - (CGRect)adjustRectWithWidthRightView:(CGRect)bounds { CGRect paddedRect = bounds; paddedRect.size.width -= CGRectGetWidth(self.rightView.frame); return paddedRect; }
Я хотел избежать подклассов UITextField для достижения этой цели, поэтому я смог использовать расширение следующим образом:
extension UITextField { func setLeftPaddingPoints(_ amount:CGFloat){ let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) self.leftView = paddingView self.leftViewMode = .always } func setRightPaddingPoints(_ amount:CGFloat) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height)) self.rightView = paddingView self.rightViewMode = .always } }затем, когда мне нужно установить заполнение текстового поля в любом месте моего приложения, я просто делаю следующее:
textField.setLeftPaddingPoints(10) textField.setRightPaddingPoints(10)надеюсь, что это помогает!
X, Y, Z-это ваши желаемые значения
textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
такой запас может быть достигнут путем установки
leftView/rightViewдоUITextField.Обновлено Для Swift 4
// Create a padding view for padding on left textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height)) textField.leftViewMode = .always // Create a padding view for padding on right textField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height)) textField.rightViewMode = .alwaysЯ только что добавил / разместил
UIViewслева и справа от текстового поля. Так что теперь ввод начнется после просмотра.спасибо
надеюсь, что это помогло...
Swift 4, Xcode 9
Мне нравится Pheepster это, но как насчет того, чтобы мы делали все это из расширения, не требуя кода VC или любого подкласса:
import UIKit @IBDesignable extension UITextField { @IBInspectable var paddingLeftCustom: 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 paddingRightCustom: 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 } } }
простое решение swift 3-добавить код для viewDidLoad:
let indentView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 20)) textField.leftView = indentView textField.leftViewMode = .alwaysНе нужно слишком много кода
чтобы создать вид заполнения для UITextField в Swift 3
func txtPaddingVw(txt:UITextField) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 5)) txt.leftViewMode = .always txt.leftView = paddingView }
подкласс UITextField-это путь. Откройте игровую площадку и добавьте следующий код:
class MyTextField : UITextField { var leftTextMargin : CGFloat = 0.0 override func textRectForBounds(bounds: CGRect) -> CGRect { var newBounds = bounds newBounds.origin.x += leftTextMargin return newBounds } override func editingRectForBounds(bounds: CGRect) -> CGRect { var newBounds = bounds newBounds.origin.x += leftTextMargin return newBounds } } let tf = MyTextField(frame: CGRect(x: 0, y: 0, width: 100, height: 44)) tf.text = "HELLO" tf.leftTextMargin = 25 tf.setNeedsLayout() tf.layoutIfNeeded()
создайте UIView с требуемым пространством заполнения и добавьте его в текстовое поле.элемент leftView и установить текстовое поле.член leftViewMode в UITextFieldViewMode.Всегда
// For example if you have textfield named title @IBOutlet weak var title: UITextField! // Create UIView let paddingView : UIView = UIView(frame: CGRectMake(0, 0, 5, 20)) //Change your required space instaed of 5. title.leftView = paddingView title.leftViewMode = UITextFieldViewMode.Always
в Swift 4.1 и Xcode 9.4.1
изначально мое текстовое поле выглядит так.
после добавления отступа в левой части моего текстового поля...
//Code for left padding textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: textFieldName.frame.height)) textFieldName.leftViewMode = .alwaysкак это мы можем создать правую сторону также.(textFieldName.rightViewMode = .всегда)
Если вы хотите SharedInstance тип кода (написать один раз использовать каждый ware) см. ниже код.
//This is my shared class import UIKit class SharedClass: NSObject { static let sharedInstance = SharedClass() //This is my padding function. func textFieldLeftPadding(textFieldName: UITextField) { // Create a padding view textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 3, height: textFieldName.frame.height)) textFieldName.leftViewMode = .always//For left side padding textFieldName.rightViewMode = .always//For right side padding } private override init() { } }звоните прямо сейчас эта функция, как это.
//This single line is enough SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
В Swift 3. Вы можете использовать пользовательский UITextField с отступом, заданным в его конструкторе. Не нужно для дополнительного объявления в контроллере.
class CustomTextField : UITextField { private let indentView = UIView(frame: CGRect(x: 0, y:0, width: 10, height: 10)) required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.leftView = indentView self.leftViewMode = .always } }
поместите этот код в свой
viewDidLoad():textField.delegate = self let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: self.textField.frame.height)) textField.leftView = paddingView textField.leftViewMode = UITextFieldViewMode.alwaysэто работает для меня :)
ответ пугала в Swift 3
let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5); override func textRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func placeholderRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) } override func editingRect(forBounds bounds: CGRect) -> CGRect { return UIEdgeInsetsInsetRect(bounds, padding) }
простой способ: для этого нужно расширить UITextField
extension UITextField { func setPadding(left: CGFloat? = nil, right: CGFloat? = nil){ if let left = left { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: left, height: self.frame.size.height)) self.leftView = paddingView self.leftViewMode = .always } if let right = right { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: right, height: self.frame.size.height)) self.rightView = paddingView self.rightViewMode = .always } } }затем вы можете установить отступ на любой край таким образом:
textField.setPadding(left: 5, right: 5)


Comments