Установить отступы для UITextField с UITextBorderStyleNone

399

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

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

Себастьян Врамба
источник

Ответы:

838

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

По сути, вы устанавливаете свойство leftView UITextFieldдля пустого представления размера требуемого отступа:

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

Работал как шарм для меня!

В Swift 3 / Swift 4 это можно сделать, выполнив

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always
Злая Форель
источник
1
Именно то, что мне было нужно, за исключением того, что мне нужно было заполнение вправо, что, конечно, в основном то же самое. Спасибо!
cg.
@Lukasz Я добавил авто-релиз к этому ответу, принятый ответ. Первая строка. РЕДАКТИРОВАТЬ: ой, может быть, я не сохранил? или мое редактирование было отклонено? В любом случае, Винсент добавил авто-релиз, так что за это!
Эрик Голдберг
1
При использовании ARC мое приложение зависает и использует много ресурсов ЦП, если я повторно использую *paddingViewнесколько текстовых полей?
Маффин Человек
3
Это плохое решение, лучше воспользуйтесь решением Нейта Флинка. Thios one не включает отступы в режиме editiong.
Яцек Квецень
3
Он не работает с несколькими текстовыми полями. Просто потребляет столько памяти и позже вылетает.
птичья клетка
177

Я создал реализацию этой категории и добавил ее в начало .mфайла.

@implementation UITextField (custom)
    - (CGRect)textRectForBounds:(CGRect)bounds {
        return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
                          bounds.size.width - 20, bounds.size.height - 16);
    }
    - (CGRect)editingRectForBounds:(CGRect)bounds {
        return [self textRectForBounds:bounds];
    }
@end

Исходя из ссылки, предоставленной Петром Блясиаком. Казалось, проще создать целый новый подкласс, а также проще добавить дополнительный UIView. Тем не менее, кажется, что чего-то не хватает, чтобы не иметь возможности управлять заполнением внутри текстового поля.

Решение Swift 4:

class CustomTextField: UITextField {
    struct Constants {
        static let sidePadding: CGFloat = 10
        static let topPadding: CGFloat = 8
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(
            x: bounds.origin.x + Constants.sidePadding,
            y: bounds.origin.y + Constants.topPadding,
            width: bounds.size.width - Constants.sidePadding * 2,
            height: bounds.size.height - Constants.topPadding * 2
        )
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds: bounds)
    }
}
Нейт Флинк
источник
6
Это выдает предупреждения о методах переопределения категорий. Смотрите этот ответ, чтобы подавить их.
пденья
5
Я предпочитаю не делать это в категории, но кроме этого это более чистое решение, чем принятый ответ.
Боб Ворк
2
Лучше использовать CGRectInset () для чего-то подобного, вместо того, чтобы бросать свой собственный. Это выглядит немного чище: return CGRectInset (bounds, 10, 8);
Деннис Манси
1
@shashwat да, вы можете указать любой отступ, который захотите
Ege Akpinar
1
Когда я добавил это 4 года назад, с iOS все было по-другому, и я согласен, что сейчас лучше создать подкласс. Однако, если вам нужен быстрый и грязный способ визуальной проверки расстояния в пикселях, это сработает;) Так что все в порядке, люди продолжают голосовать!
Нейт Флинк
139

Версия Swift 3 для Xcode> 6, где вы можете редактировать значение вставки в Интерфейсном Разработчике / Раскадровке.

import UIKit

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var inset: CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

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

}

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

bandejapaisa
источник
1
Я не вижу текстовое поле формы на моем.
Okysabeni
2
Мне нужно было добавить эту строкуoverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Майкл
2
Этот ответ был бы более полезным с объяснением или ссылкой на объяснение того, что @IBDesignableи @IBInspectableделать, то есть этот пост на nshipster
Рассел Остин
1
Если вы полагаетесь на какие-либо дополнительные виды (например, функциональность кнопки очистки в UITextField), тогда вы return super.textRectForBounds(CGRectInset(bounds, inset, inset))будете корректно обрабатывать смещение от дополнительных видов.
Майк Фэй
@okysabeni вам нужно щелкнуть по текстовому полю и изменить класс на FormTextField
Густаво Барбоза
77

Изменить: все еще работает в iOS 11.3.1

В iOS 6 myTextField.leftView = paddingView;вызывает проблему

Это решает проблему

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0)

Для выровненного по правому краю текстового поля используйте CATransform3DMakeTranslation(-5, 0, 0)как упоминание latenitecoder в комментариях

Индер Кумар Раторе
источник
1
Хорошо, мне пришлось поместить отступ во все текстовые поля приложения, я создал категорию UITextField и поместил этот код внутри - (void) awakeFromNib {}, и это решило мою проблему
Teena nath Paul
Так просто! Спасибо :) У меня есть вопрос, как я могу сделать простой код, чтобы сделать все UITextField вместо того, чтобы писать код много раз?
Луай Калкатави
1
Все остальные комментарии предполагают, что вы хотите добавить UITextField слева. Создание подклассов - это большие затраты на добавление некоторого идентификатора пробела, а не просто на добавление нескольких пустых символов, но это решение - РЕШЕНИЕ. Одна линия на будущее. Если вы работаете с текстовым полем, выровненным по тексту по правому краю, используйте минус-значение (-5,0,0). Спасибо, Inder
latenitecoder,
1
Через 4 года я нашел свой ответ: D, @latenitecoder, твой комментарий был тем, что нужно. Обновление ответа
Inder Kumar Rathore
1
что я могу сделать, если я хочу и правую и левую прокладку ??
Мина Ханна
70

Хороший подход для добавления отступов в UITextField - это создать подкласс и добавить свойство edgeInsets. Затем вы устанавливаете edgeInsets, и UITextField будет отображаться соответственно. Это также будет работать правильно с пользовательским набором leftView или rightView.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end
Броди Робертсон
источник
Это должен быть принят ответ. Это также работает для правого и левого взглядов ..
NSPratik
25

Просто создайте подкласс UITextField следующим образом:

@implementation DFTextField


- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, 10.0f, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return [self textRectForBounds:bounds];
}


@end

Это добавляет горизонтальный отступ 10 пунктов с каждой стороны.

Camsoft
источник
21

Objective C Code

MyTextField.h

#import <UIKit/UIKit.h>

@interface MyTextField : UITextField

@property (nonatomic) IBInspectable CGFloat padding;

@end

MyTextField.m

#import "MyTextField.h"

IB_DESIGNABLE
@implementation MyTextField

@synthesize padding;

-(CGRect)textRectForBounds:(CGRect)bounds{
    return CGRectInset(bounds, padding, padding);
}

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return [self textRectForBounds:bounds];
}

@end

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

Кирит Вагела
источник
1
developer.apple.com/library/ios/recipes/…
Геннадий Рябкин
20
  1. Создать текстовое поле Custom

PaddingTextField.swift

import UIKit
class PaddingTextField: UITextField {

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

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

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    return textRectForBounds(bounds)
}}
  1. Установите класс текстового поля PaddingTextField и настройте свой отступ по своему усмотрению. введите описание изображения здесь введите описание изображения здесь

  2. Наслаждайся этим

окончательный

777Q
источник
19

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

Заголовочный файл:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

-(void) setRightPadding:(int) paddingValue;
@end

Файл реализации:

#import "UITextField+PaddingText.h"

@implementation UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.leftView = paddingView;
    self.leftViewMode = UITextFieldViewModeAlways;
}

-(void) setRightPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.rightView = paddingView;
    self.rightViewMode = UITextFieldViewModeAlways;
}

@end

Пример использования

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Надеюсь, это поможет вам, ребята

ура

Пауло Мигель Алмейда
источник
14

Swift версия:

extension UITextField {
    @IBInspectable var padding_left: CGFloat {
        get {
            LF.log("WARNING no getter for UITextField.padding_left")
            return 0
        }
        set (f) {
            layer.sublayerTransform = CATransform3DMakeTranslation(f, 0, 0)
        }
    }
}

Так что вы можете присвоить значение в IB

Параметр IBInspectable представлен в Интерфейсном Разработчике

superarts.org
источник
IBInspectableпозволяет применять установочный код во время выполнения, поэтому просто введите свой номер, Interface Builderи он будет работать.
superarts.org
Это не будет работать, когда у вас есть Clear Button. Ваша кнопка очистки не будет видна, если применить это решение.
Bhavin_m
11

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

Томас Клейсон
источник
10

Просто создайте подкласс 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 пунктов с обеих сторон.

Король-Мастер
источник
8

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

- (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];
}
Stoto
источник
6

Обновленная версия для 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)
    }
}
Beninho85
источник
6

Установить отступы для 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 в этот метод и добавить отступы для правого и левого, а также задать цвет текста и фона, написав всего одну строку кода, как показано ниже:

[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()

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

Рандика Вишман
источник
5

Вот как этого добиться в 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
}
}

Ресурс

DrPatience
источник
5

Версия Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;
Фил
источник
4

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

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

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

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

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

woody121
источник
В некоторых случаях ваше более простое решение действительно является правильным выбором, но ваше простейшее решение - это хак, который также не работает, если краевые пиксели вашего изображения имеют переменную альфа (не говоря уже о том, что Apple может изменить их реализацию в будущем выпуске iOS).
jmdecombe
Я не согласен с вами - вот почему я пишу «ленивый легкий путь» во всех заглавных буквах. Его отлично сработало для меня на сегодняшний день.
woody121
4

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

Имейте в виду, что если вы хотите включить Clear Buttonто же самое, UITextFieldто вы должны оставить пустое поле справа.

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     
        }
    }
}  
Bhavin_m
источник
3

Лучший способ сделать это - просто создать класс, используя подкласс 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

Версия 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)
    }
}
王怡飞
источник
2

Ответ Нейта Флинка мой любимый, но не забывайте о правом / левом взглядах. Например, для 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.

rafalkitta
источник
2

Swift 3 Solution

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)
 }
}
Бен Салливан
источник
2

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

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

и звоните используя

self.txtPaddingVw(txtPin)
Хардик Таккар
источник
2

Вы можете использовать категорию. установить отступы влево и вправо

UITextField + Padding.h

@interface UITextField (Padding)
@property (nonatomic, assign) CGFloat paddingValue;
@property (nonatomic, assign) CGFloat leftPadding;
@property (nonatomic, assign) CGFloat rightPadding;

//overwrite
-(CGRect)textRectForBounds:(CGRect)bounds;
-(CGRect)editingRectForBounds:(CGRect)bounds;
@end

UITextField + Padding.m

#import "UITextField+Padding.h"
#import <objc/runtime.h>

static char TAG_LeftPaddingKey;
static char TAG_RightPaddingKey;
static char TAG_Left_RightPaddingKey;

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(CGRect)textRectForBounds:(CGRect)bounds {

CGFloat offset_Left=0;
CGFloat offset_Right=0;
if (self.paddingValue>0) {
    offset_Left=self.paddingValue;
    offset_Right=offset_Left;
}else{
    if (self.leftPadding>0){
        offset_Left=self.leftPadding;
    }
    if (self.rightPadding>0){
        offset_Right=self.rightPadding;
    }
}

if (offset_Left>0||offset_Right>0) {
    return CGRectMake(bounds.origin.x+ offset_Left ,bounds.origin.y ,
                      bounds.size.width- (offset_Left+offset_Right), bounds.size.height-2 );
 }else{
    return bounds;
 }
}



-(CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop


#pragma maek -setter&&getter
- (CGFloat)paddingValue
{
    return [objc_getAssociatedObject(self,&TAG_Left_RightPaddingKey) floatValue];
}
-(void)setPaddingValue:(CGFloat)paddingValue
{
    objc_setAssociatedObject(self, &TAG_Left_RightPaddingKey, @(paddingValue), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)leftPadding
{
    return [objc_getAssociatedObject(self,&TAG_LeftPaddingKey) floatValue];
}

-(void)setLeftPadding:(CGFloat)leftPadding
{
    objc_setAssociatedObject(self, &TAG_LeftPaddingKey, @(leftPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)rightPadding
{
    return [objc_getAssociatedObject(self,&TAG_RightPaddingKey) floatValue];
}

-(void)setRightPadding:(CGFloat)rightPadding
{
    objc_setAssociatedObject(self, &TAG_RightPaddingKey, @(rightPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

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

rikiluo
источник
1

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

Подкласс 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]];
        }
    }
}
Кишор Кундан
источник
метод может быть вызван [self addPaddingToAllTextFields: [self view]];
Кишор Кундан
Поскольку textfieldarrayво втором ifблоке не определено , я успешно использовал этот фрагмент (спасибо!) После замены содержимого второго ifнаfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup
1

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

Lubakis
источник
1

Лучшее решение, которое я нашел, - это категория. Вот как я добавляю отступы 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

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

Монги Заиди
источник
Проблема с перегрузкой метода в категориях заключается в том, что он будет помечен как неиспользуемый в AppCode, чем он и является на самом деле. Хорошая идея, но не очень безопасная, потому что она легко удаляется, когда вы запускаете «Оптимизировать импорт» (хотя это не проблема для пользователей XCode, но мы все знаем ограниченные возможности, ориентированные на код)
Себастьян Врамба,
1
Это простая категория обломков, которая будет применять отступы для всех текстовых полей в приложении?
Бен Синклер
@ И нет, он применяется только при импорте, вам нужно будет создать класс UITextField + Padding и импортировать его в viewcontroller, или у вас есть текстовое поле с отступом
Mongi Zaidi
@MongiZaidi: вы не правы. Он связывается с исполняемым файлом независимо от того, является ли импортируемый объект несущественным.
Жолт Сатмари
1
textField.layer.borderWidth = 3;

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

Сакиб Сауд
источник
0

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

user1686700
источник