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

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

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

Ответы [ 32 ]

11 голосов
/ 16 сентября 2010

Вы не можете установить отступы.Вместо этого имейте UIView, в котором есть ваше фоновое изображение и UITextField внутри него.Установите UITextField ширину как UIViewWidth-(paddingSize x 2) и высоту аналогичным образом, а затем установите ее в точке paddingSize,paddingSize.

8 голосов
/ 16 января 2013

Я основывался на решении Нейта, но потом обнаружил, что это вызывает проблемы, когда вы используете свойства leftView / rightView, поэтому лучше настроить реализацию супер, потому что она будет учитывать левый / правый вид.*

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect ret = [super textRectForBounds:bounds];
    ret.origin.x = ret.origin.x + 5;
    ret.size.width = ret.size.width - 10;
    return ret;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
8 голосов
/ 22 ноября 2014

Просто подкласс UITextField вот так ( Swift версия ):

import UIKit

class CustomTextField: UITextField {

    override func textRectForBounds(bounds: CGRect) -> CGRect {
       return CGRectInset(bounds, 25.0, 0)
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
       return self.textRectForBounds(bounds)
    }

}

Это добавляет горизонтальные отступы 25,0 по обе стороны.

5 голосов
/ 15 декабря 2015

Версия Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;
5 голосов
/ 06 мая 2015

Вот как этого добиться в SWIFT

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
super.viewDidLoad()
let paddingView = UIView(frame: CGRectMake(0, 0, 10, self.yourTextField.frame.height))
yourTextField.leftView = paddingView
yourTextField.leftViewMode = UITextFieldViewMode.Always
}
}

Ресурс

4 голосов
/ 22 марта 2013

^ эти предложения отлично подходят для тех, кто программно создает интерфейс.

Но для тех из нас, кто использует конструктор интерфейса Xcode, есть два LAZY EASY WAY:

  • проще: поместите UIImageView позади текстового поля

  • самый простой: измените стиль рамки на свой простой черный квадрат (второй слева), затем добавьте свое изображение в качестве фонового изображения. Изображение имеет приоритет над квадратом,так что вы по-прежнему получаете отступы, необходимые для нормального фона изображения, без отображения квадрата.

РЕДАКТИРОВАТЬ: вы также можете использовать черную сферу (третий слева) при выбореUITextBox в IB), он не работает в крайнем правом стиле «графическая сфера».

3 голосов
/ 19 октября 2016

Обновленная версия для Swift 3:

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var paddingLeft: CGFloat = 0
    @IBInspectable var paddingRight: CGFloat = 0

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

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }
}
3 голосов
/ 19 марта 2015

Лучший способ сделать это - просто создать класс, используя подкласс UITextField и в файле .m

 #import "CustomTextField.h"
 #import <QuartzCore/QuartzCore.h>
 @implementation CustomTextField


- (id)initWithCoder:(NSCoder*)coder 
 {
  self = [super initWithCoder:coder];

  if (self) {

//self.clipsToBounds = YES;
//[self setRightViewMode:UITextFieldViewModeUnlessEditing];

self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
self.leftViewMode=UITextFieldViewModeAlways;
   }

  return self;

 }

выполнив это, перейдите на раскадровку или в XIB и нажмите на инспектор идентичности и замените UITextfield собственным «CustomTextField» в опции класса.

Примечание: если вы просто дадите отступ с автоматическим макетом для текстового поля, тогда ваше приложение не запустится и покажет только пустой экран.

3 голосов
/ 18 марта 2014

Установить заполнение для UITextField с помощью UITextBorderStyleNone: Swift

Основываясь на наиболее голосуемом ответе @Evil Trout, я создал собственный метод в своем классе ViewController, как показано ниже:

- (void) modifyTextField:(UITextField *)textField
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
    textField.leftView = paddingView;
    textField.leftViewMode = UITextFieldViewModeAlways;
    textField.rightView = paddingView;
    textField.rightViewMode = UITextFieldViewModeAlways;

    [textField setBackgroundColor:[UIColor whiteColor]];
    [textField setTextColor:[UIColor blackColor]];
}

Теперь я могу вызвать этот метод внутри (метод viewDidLoad) и отправить в него любой из моих TextFields и добавить отступы для правого и левого, а также задать текст и фоновые цвета, написав всего одну строку кода, как показано ниже: 1006 *

[self modifyTextField:self.firstNameTxtFld];

Это отлично сработало на iOS 7! Я знаю, что добавление слишком большого количества представлений может сделать этот класс более тяжелым для загрузки. Но когда меня беспокоили трудности других решений, я обнаружил, что более склонен к этому методу и более гибок в использовании этого способа. ;)

Спасибо за взлом "Злая форель"! (Лук)

Я подумал, что мне следует обновить фрагмент кода этого ответа с помощью Swift:

Поскольку Swift позволяет нам писать расширения для существующих классов, давайте напишем это следующим образом.

extension UITextField {
    func addPaddingToTextField() {
        let paddingView: UIView = UIView.init(frame: CGRectMake(0, 0, 8, 20))
        self.leftView = paddingView;
        self.leftViewMode = .Always;
        self.rightView = paddingView;
        self.rightViewMode = .Always;


        self.backgroundColor = UIColor.whiteColor()
        self.textColor = UIColor.blackColor()
    }
}

Использование:

self.firstNameTxtFld.addPaddingToTextField()

Надеюсь, это будет полезно кому-то еще!
Ура!

2 голосов
/ 23 августа 2016

Решение Swift 3

class CustomTextField: UITextField {

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

 override func editingRect(forBounds bounds: CGRect) -> CGRect {
  return self.textRect(forBounds: bounds)
 }
}
...