it-swarm.com.ru

Добавить левое поле в UITextField

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

21
iOSPawan

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

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

18
clopez

Вы можете сделать это, расширив класс 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
43
Riad Krim
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;

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

11
btmanikandan

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

7
Mamta

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

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

Плохой:

 enter image description here

Хорошо:

 enter image description here

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

3
Ethan Parker

я достиг почти переопределением - (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;


}
1
iOSPawan

Для Swift 4 :

Я предпочитаю использовать класс IBDesignable и свойства 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
Payne Miller