Установить отступы для UITextField с помощью UITextBorderStyleNone - PullRequest
384 голосов
/ 16 сентября 2010

Я хотел использовать собственный фон для моего UITextFields.Это прекрасно работает, за исключением того факта, что я должен использовать UITextBorderStyleNone, чтобы он выглядел красиво.Это заставляет текст придерживаться влево без каких-либо отступов.

Можно ли вручную установить отступ, чтобы он выглядел как UITextBorderStyleRoundedRect за исключением использования моего собственного фонового изображения?

Ответы [ 32 ]

2 голосов
/ 29 сентября 2017

Swift 3 Версия:

class CustomTextField:UITextField{

    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect.init(x: bounds.origin.x + 8, y: bounds.origin.y, width: bounds.width, height: bounds.height)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds:bounds)
    }
}
1 голос
/ 31 августа 2015
textField.layer.borderWidth = 3;

добавит рамку, которая работала для меня как отступ.

1 голос
/ 03 февраля 2014

Решение Броди отлично сработало для меня.Мне пришлось добавить вид сбоку на текстовое поле и добавить дополнительные отступы.Таким образом, благодаря реализации пользовательского свойства UIEdgeInsets для подкласса UITextField мне удалось решить эту задачу.Я собираюсь использовать этот новый подкласс во всех моих проектах.

1 голос
/ 11 февраля 2014

Лучшее решение, которое я нашел, - это категория.Вот как я добавляю отступы в 5 пунктов влево и вправо:

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.origin.x + 5, bounds.origin.y,
                      bounds.size.width - 10, bounds.size.height);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop

@end

# Прагмы просто для удаления раздражающих предупреждений

1 голос
/ 23 мая 2016

Ответ Нейта Флинка мой любимый, но не забывайте о правом / левом просмотре.Например, для UITextField подкласс:

override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
    let rightViewBounds = super.rightViewRectForBounds(bounds)

    return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds))
}

Выше указанного кода установите правый отступ для rightView из UITextField.

1 голос
/ 31 июля 2018

Если кто-то ищет Swift 4.0 версию, то ниже extension работает. Он имеет Left и Right отступы для UITextField. На самом деле это IBInspectable для конфигурации раскадровки. Вы можете установить значение непосредственно из Интерфейсного Разработчика / Раскадровки. Это проверенный код в версии Swift 4.0 и Xcode 9.0

Имейте в виду, что если вы хотите включить Clear Button для того же UITextField, то вы должны оставить пустым 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     
        }
    }
}  
1 голос
/ 25 октября 2013

@ Ответ злой форели великолепен. Я использую этот подход уже довольно давно. Единственное, чего ему не хватает, это «иметь дело с многочисленными текстовыми полями». Я пробовал другие подходы, но, похоже, не работает.

Подкласс UITextField просто для добавления отступов не имеет никакого смысла для меня. Итак, я перебрал все поля UITextFields, чтобы добавить заполнение.

-(void) addPaddingToAllTextFields:(UIView*)view {

    for(id currentView in [view subviews]){
        if([currentView isKindOfClass:[UITextField class]]) {
            // Change value of CGRectMake to fit ur need
            [currentView setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)]];
            [currentView setLeftViewMode:UITextFieldViewModeAlways];
        }

        if([currentView respondsToSelector:@selector(subviews)]){
            [textfieldarray addObjectsFromArray:[self addPaddingToAllTextFields:currentView]];
        }
    }
}
1 голос
/ 17 ноября 2016

вы можете использовать категорию.установить отступы слева и справаможно установить заполнение следующим образом: self.phoneNumTF.paddingValue = 10.f;или self.phoneNumTF.leftPadding = 10.f;

1 голос
/ 13 сентября 2016

Вот код Swift для заполнения в UITextfield

 func txtPaddingVw(txt:UITextField) {
     let paddingView = UIView(frame: CGRectMake(0, 0, 10, 10))
     txt.leftViewMode = .Always
     txt.leftView = paddingView
 }

и позвоните по номеру

self.txtPaddingVw(txtPin)
0 голосов
/ 15 июля 2013

Почему бы не строка атрибута!?!, Это одна из функций благословения IOS 6.0:)

NSMutableParagraphStyle *mps = [[NSMutableParagraphStyle alloc] init];
            mps.firstLineHeadIndent = 5.0f;
UIColor *placeColor = self.item.bgColor;

textFieldInstance.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"My Place Holder" attributes:@{NSForegroundColorAttributeName: placeColor, NSFontAttributeName : [UIFont systemFontOfSize:7.0f], NSParagraphStyleAttributeName : mps}];
...