Добавить lefthand margin в UITextField

Я хочу поместить левое поле текста UITextField в 10 пикселей. Каков наилучший способ сделать это?

Ответ 1

Как я объяснил в предыдущем комментарии, лучшим решением в этом случае является расширение класса UITextField вместо использования категории, поэтому вы можете использовать его явно в желаемых текстовых полях.

#import <UIKit/UIKit.h>

@interface MYTextField : UITextField

@end


@implementation MYTextField

- (CGRect)textRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    int margin = 10;
    CGRect inset = CGRectMake(bounds.origin.x + margin, bounds.origin.y, bounds.size.width - margin, bounds.size.height);
    return inset;
}

@end

Категория предназначена для добавления новых функций в существующий класс, а не для переопределения существующего метода.

Ответ 2

Вы можете сделать это, расширив класс UITextField и переопределив два метода:

- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;

Вот код:

Интерфейс в MYTextField.h

@interface MYTextField : UITextField

@end

Его реализация в MYTextField.m

@implementation MYTextField

static CGFloat leftMargin = 28;

 - (CGRect)textRectForBounds:(CGRect)bounds
{
    bounds.origin.x += leftMargin;

    return bounds;
}

 - (CGRect)editingRectForBounds:(CGRect)bounds
{
    bounds.origin.x += leftMargin;

    return bounds;
}
@end

Ответ 3

UITextField * textField = [[UITextField alloc]init];
[textField setDelegate:self];
[textField setFrame:CGRectMake(170,112,140,25)];
[textField setBorderStyle:UITextBorderStyleNone];
[textField setBackgroundColor:[UIColor clearColor]];
[self.View addSubview:noofChildTField];

UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)] autorelease];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

Попробуйте этот код

Ответ 4

Для Swift 3:

Сделайте выход из UITextField, скажем usernameTextField. Затем напишите следующий код в viewDidLoad()

let paddingView : UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
usernameTextField.leftView = paddingView
usernameTextField.leftViewMode = .always

Измените width: 5 на большее значение, если требуется больше места.

Ответ 5

Я надеялся увидеть настройку в IB в инспекторе свойств, чтобы настроить это значение. Оказывается, я нечаянно установил выравнивание и стиль границы для значений, которые испортились с заполнением слева.

Вы бы не подумали, что было бы очень важно выбрать право налево и отсутствие границы, но это делает слова в основном перекрывающимися или приближающимися к краю окна, и это выглядит неправильно.

Плохо:

введите описание изображения здесь

Хорошо:

введите описание изображения здесь

Исправлено это для меня. Надеюсь, это тоже поможет кому-то другому.

Ответ 6

i достигнуто почти путем переопределения - (CGRect)textRectForBounds:(CGRect)bounds. теперь проблема заключается в том, когда TextField переходит в режим редактирования своего левого поля reset до нуля...

@implementation UITextField(UITextFieldCatagory)

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect theRect=CGRectMake(bounds.origin.x+10, bounds.origin.y, bounds.size.width-10, bounds.size.height);
    return theRect;


}

Ответ 7

Подкласс UITextField и добавьте расширение:

extension UITextField {
    func paddingLeft(inset: CGFloat){
        self.leftView = UIView(frame: CGRect(x: 0, y: 0, width: inset, height: self.frame.height))
        self.leftViewMode = UITextField.ViewMode.always
    }
}

usage

использования
class MyUITextFieldClass: UITextField {
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.paddingLeft(inset: 10)
    }
}

Ответ 8

Для Swift 4:

Я предпочитаю использовать IBDesignable и IBInspectable чтобы позволить мне устанавливать IBInspectable через раскадровки Xcode и сохранять ее повторно. Я также обновил код для работы в Swift 4.

import Foundation
import UIKit

@IBDesignable
class PaddableTextField: UITextField {

    var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)

    @IBInspectable var left: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var right: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var top: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    @IBInspectable var bottom: CGFloat = 0 {
        didSet {
            adjustPadding()
        }
    }

    func adjustPadding() {
         padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
         return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
    }
}

Ответ 9

Вы можете попробовать это

TextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
TextField.textAlignment = UITextAlignmentCenter;