Добавить левое поле в UITextField - PullRequest
22 голосов
/ 15 апреля 2011

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

Ответы [ 8 ]

44 голосов
/ 11 мая 2011

Вы можете сделать это, расширив класс 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
19 голосов
/ 28 марта 2012

Как я объяснил в предыдущем комментарии, лучшим решением в этом случае является расширение класса 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

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

11 голосов
/ 23 марта 2013
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;

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

8 голосов
/ 09 января 2017

Для 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 на большее значение, если требуется больше места.

3 голосов
/ 09 марта 2016

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

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

Bad:

enter image description here

Хорошо:

enter image description here

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

1 голос
/ 15 апреля 2011

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

@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;


}
0 голосов
/ 02 декабря 2018

Для Swift 4 :

Я предпочитаю использовать IBDesignable class и 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))
    }
}
0 голосов
/ 15 апреля 2011

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

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