Встановіть набивання для UITextField за допомогою UITextBorderStyleNone


399

Я хотів використовувати власний фон для свого UITextFields. Це прекрасно працює, за винятком того, що я повинен використовувати, UITextBorderStyleNoneщоб це виглядало красиво. Це змушує текст дотримуватися ліворуч без жодної прокладки.

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

Відповіді:


837

Я знайшов акуратний маленький хак, щоб встановити ліву підкладку для цієї точної ситуації.

В основному, ви встановлюєте властивість 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 Я додав автовипуск до цієї відповіді, прийняту відповідь. Перша лінія. EDIT: На жаль, я не врятував? чи мою редакцію відхилено? Так чи інакше, додав Вінсент у автовипуску, так що так!
Ерік Голдберг

1
Використовуючи ARC, чому моє додаток висить і використовує багато процесора, якщо я повторно використовую *paddingViewкілька текстових полів?
The Muffin Man

3
Це погане рішення, краще перейдіть до рішення Нейт Флінка. Тим-один не включає прокладку в режимі редагування.
Jacek Kwiecień

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 () для чогось подібного, а не прокручувати своє. Це також виглядає трохи чистіше: поверніть CGRectInset (межі, 10, 8);
Денніс Мюнсі

1
@shashwat так, ви можете вказати будь-яку прокладку, яку ви хочете
Ege Akpinar

1
Коли я додав це 4 роки тому, з iOS все було інакше, і я згоден, що зараз найкраще створити підклас. Однак якщо ви просто хочете, щоб швидкий і брудний спосіб візуально перевірити відстані пікселів, це зробить це;) Тож нормально, щоб люди продовжували голосувати !!
Нейт Флінк

139

Версія Swift 3 для Xcode> 6, де ви можете редагувати значення вставки у програмі Interface Builder / Storyboard.

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)
    }

}

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


1
Я не бачу текстового поля форми в моєму.
окісабені

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
Gustavo Barbosa

77

Редагувати: все ще працює в iOS 11.3.1

В iOS 6 myTextField.leftView = paddingView; викликає проблеми

Це вирішує проблему

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

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


1
Приємно, мені довелося помістити прокладку у всі текстові поля програми, я створив категорію UITextField і помістив цей код всередину - (недійсний) прокинувсяFromNib {}, і це вирішило мою проблему
Teena nath Пол

Так просто! Thx :) У мене виникає питання, як я можу зробити простий код, щоб зробити все UITextField замість того, щоб писати код багато разів?
Luai Kalkatawi

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 балів в обидві сторони.


21

Об'єктивний кодекс С

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

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



20
  1. Створіть спеціальне текстове поле

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. Насолоджуйся цим

остаточний


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

Швидка версія:

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)
        }
    }
}

Так що ви можете призначити значення в ІБ

Налаштування IBInspectable, представлене в Interface Builder


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

Я базувався на рішенні Nate, але тоді я виявив, що це спричиняє проблеми, коли ви використовуєте властивості 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];
}

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)
    }
}

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) і надіслати будь-яке з моїх текстових полів до цього методу та додати набивання для правого і лівого, і надати кольори тексту та фону, записавши лише один рядок коду, як описано нижче:

[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
}
}

Ресурс


5

Версія Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;

4

^ ці пропозиції чудово підходять для тих, хто програмно створює інтерфейс.

Але для тих, хто використовує конструктор інтерфейсів Xcode, є два ЛЕГИЙ ПРОСТІ ШЛЯХИ:

  • простіше: поставте UIImageView за текстове поле

  • Найпростіше: змініть стиль межі на вашому простому чорному квадраті (другий зліва), а потім додайте зображення як фонове зображення. Зображення має перевагу над квадратом, тому ви все одно отримуєте прокладки, необхідні для нормального фону зображення, без площі насправді намальованого.

РЕДАКТУВАННЯ: ви також можете використовувати чорну сферу (третя зліва опція при виборі UITextBox у IB), вона не працює з крайнім правою, стилем "графічної сфери".


Ваше легше рішення - дійсно вірний вибір у деяких випадках, але найпростішим рішенням є злом, який також не працює, якщо крайові пікселі зображення мають змінну альфа (не кажучи вже про те, що 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     
        }
    }
}  

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.


2

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)
 }
}

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;


1

@ Відповідь форелі чудова. Я використовую такий підхід вже досить давно. Єдине, чого йому бракує, - це "обробка численних текстових полів". Я спробував інші підходи, але, схоже, не виходить.

Підкласифікація 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, я зумів досягти цього завдання. Я буду використовувати цей новий підклас у всіх своїх проектах.


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 немає проблем, але всі ми знаємо обмежені функції, орієнтовані на код)
Sebastian Wramba

1
Це проста категорія, яка застосовуватиме прокладки для всіх текстових полів у додатку?
Бен Сінклер

@Andy не застосовується тільки при імпорті його, вам потрібно буде створити клас UITextField + відступ і імпортувати його в ViewController або класі у вас є текстове поле з прокладкою
Монжу Зайди

@MongiZaidi: ви помиляєтесь. Це пов'язується з виконуваним файлом, незалежно від того, чи імпортуватись не має значення.
Жолт Сатмарі


0

Інша думка полягає в тому, що якщо у вас є більше, UITextFieldде ви додаєте прокладки, це створити окреме UIViewдля кожного текстового поля - оскільки вони не можуть бути спільними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.