Ustaw padding dla UITextField z UITextBorderStyleNone


399

Chciałem użyć niestandardowego tła dla mojego UITextFields. Działa to dobrze, z wyjątkiem tego, że muszę użyć, UITextBorderStyleNoneaby wyglądać ładnie. To zmusza tekst do przylgnięcia w lewo bez dopełniania.

Czy mogę ustawić dopełnienie ręcznie, aby wyglądało podobnie, z UITextBorderStyleRoundedRectwyjątkiem korzystania z niestandardowego obrazu tła?

Odpowiedzi:


837

Znalazłem schludny mały hack, aby ustawić lewą wyściółkę dla tej dokładnej sytuacji.

Zasadniczo ustawiasz właściwość leftView UITextFieldna pusty widok rozmiaru wypełnienia, który chcesz:

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

Dla mnie zadziałało jak urok!

W Swift 3 / Swift 4 można to zrobić

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always

1
Dokładnie to, czego potrzebowałem, z wyjątkiem tego, że potrzebowałem wyściółki po prawej stronie, która jest w większości taka sama, oczywiście. Dzięki!
cg.

@ Łukasz dodał do tej odpowiedzi odpowiedź automatyczną. Pierwsza linia. EDYCJA: ups, może nie zapisałem? czy moja edycja została odrzucona? Tak czy inaczej, Vincent dodał automatyczne wydanie, więc tak!
Eric Goldberg,

1
Używając ARC, dlaczego moja aplikacja zawiesza się i używa dużej ilości procesora, jeśli ponownie wykorzystuję *paddingViewwiele pól tekstowych?
The Muffin Man,

3
To złe rozwiązanie, lepiej skorzystaj z rozwiązania Nate Flink. Thios one nie obejmuje wypełniania w trybie edycji.
Jacek Kwiecień

3
Nie działa z wieloma polami tekstowymi. Po prostu zużywa tyle pamięci, a później ulega awarii.
klatka dla ptaków

177

Utworzyłem tę kategorię implementacji i dodałem ją na początku .mpliku.

@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

Na podstawie linku udostępnionego przez Piotra Blasiaka. Wydawało się to prostsze niż stworzenie zupełnie nowej podklasy, a także prostsze niż dodanie dodatkowej UIView. Mimo to wydaje się, że czegoś brakuje, aby nie móc kontrolować wypełnienia w polu tekstowym.

Rozwiązanie 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
Powoduje to wyświetlenie ostrzeżeń o metodach zastępujących kategorie. Zobacz tę odpowiedź, aby je ukryć.
pdenya

5
Wolę nie robić tego w kategorii, ale poza tym jest to czystsze rozwiązanie niż zaakceptowana odpowiedź.
Bob Vork,

2
Lepiej jest użyć CGRectInset () do czegoś takiego, niż tworzyć własne. Wygląda też trochę ładniej: zwraca CGRectInset (bounds, 10, 8);
Dennis Munsie

1
@shashwat tak, możesz określić dowolne wypełnienie, jakie chcesz
Ege Akpinar

1
Kiedy dodałem to 4 lata temu, z iOS było inaczej i zgadzam się, że teraz najlepiej jest utworzyć podklasę. Jeśli jednak chcesz po prostu szybkiego i brudnego sposobu wizualnego sprawdzenia odległości w pikselach, zrobi to;) Więc ludzie mogą głosować !!
Nate Flink

139

Wersja Swift 3 dla Xcode> 6, w której można edytować wartość wstawki w Konstruktorze / 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)
    }

}

wprowadź opis zdjęcia tutaj


1
Nie widzę pola tekstowego formularza na moim.
okysabeni

2
Musiałem dodać tę linięoverride func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
Michael

2
Ta odpowiedź byłaby bardziej pomocna z wyjaśnieniem lub linkiem do wyjaśnienia, co @IBDesignablei co @IBInspectablerobić, tj. Tego postu w nshipster
Russell Austin

1
Jeśli korzystasz z dowolnych widoków akcesoriów (takich jak funkcja kasowania przycisków w UITextField) return super.textRectForBounds(CGRectInset(bounds, inset, inset)), odpowiednio poradzisz sobie z przesunięciem widoków akcesoriów.
Mike Fay,

@okysabeni, musisz kliknąć pole tekstowe i zmienić klasę na FormTextField
Gustavo Barbosa

77

Edycja: Nadal działa w systemie iOS 11.3.1

W iOS 6 myTextField.leftView = paddingView;powoduje problem

To rozwiązuje problem

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

W przypadku wyrównanego do prawej pola tekstowego użyj CATransform3DMakeTranslation(-5, 0, 0)jako wzmianki przez latenitecoder w komentarzach


1
Fajnie, musiałem umieścić padding we wszystkich polach tekstowych aplikacji, utworzyłem kategorię UITextField i umieściłem ten kod w środku - (void) awakeFromNib {} i to rozwiązało mój problem
Teena nath Paul

Tak prosty! Dzięki :) Mam pytanie, jak mogę zrobić prosty kod, aby utworzyć cały UITextField zamiast pisać kod wiele razy?
Luai Kalkatawi,

1
Wszystkie pozostałe komentarze zakładają, że chcesz wstawić pole UITextField od lewej. Podklasowanie wiąże się z dużym nakładem pracy, ponieważ dodanie identyfikatora odstępu powoduje dodanie pustych znaków, ale to rozwiązanie jest rozwiązaniem. Jednoliniowy dowód na przyszłość. Jeśli pracujesz z polem tekstowym wyrównanym do prawej, użyj wartości minus (-5,0,0) Dzięki Inder
latenitecoder

1
Po 4 latach znalazłem własną odpowiedź: D, @latenitecoder twój komentarz był potrzebny. Aktualizacja odpowiedzi
Inder Kumar Rathore

1
co mogę zrobić, jeśli chcę zarówno prawą, jak i lewą wyściółkę?
Mina Hanna,

70

Dobrym podejściem do dodawania dopełnienia do UITextField jest podklasa i dodanie właściwości edgeInsets. Następnie ustawisz edgeInsets, a pole UITextField zostanie odpowiednio narysowane. Będzie to również działać poprawnie z niestandardowym zestawem leftView lub 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

Należy zaakceptować odpowiedź. Działa również dla widoków z prawej i lewej strony.
NSPratik

25

Wystarczy podklasować UITextField w następujący sposób:

@implementation DFTextField


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

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


@end

Dodaje poziomą wyściółkę po 10 punktów z każdej strony.


21

Kod celu C

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

wprowadź opis zdjęcia tutaj



20
  1. Utwórz niestandardowe pole tekstowe

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. Ustaw klasę pola tekstowego na PaddingTextField i dostosuj dopełnianie, jak chcesz wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

  2. Ciesz się

finał


19

W oparciu o odpowiedź Evil Trout możesz chcieć utworzyć kategorię, aby ułatwić korzystanie z wielu aplikacji.

Plik nagłówka:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

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

Plik implementacyjny:

#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

Przykład użycia

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

Mam nadzieję, że to wam pomoże

Twoje zdrowie


14

Wersja szybka:

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

Abyś mógł przypisać wartość w IB

IBInspectable ustawienie reprezentowane w Konstruktorze interfejsów


IBInspectablepozwala na zastosowanie kodu ustawiającego w czasie wykonywania, więc po prostu wpisz swój numer Interface Builderi będzie działać.
superarts.org,

To nie zadziała, kiedy masz Clear Button. Twój wyraźny przycisk nie będzie widoczny, jeśli zastosujesz to rozwiązanie.
Bhavin_m

11

Nie możesz ustawić paddingu. Zamiast tego UIViewumieść obraz tła i jego UITextFieldwnętrze. Ustaw UITextFieldszerokość jako UIViewWidth-(paddingSize x 2)i wysokość w podobny sposób, a następnie ustaw ją w punkcie paddingSize,paddingSize.


10

Wystarczy podklasę UITextField jak ta ( wersja 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)
    }

}

Dodaje to dopełnienie w poziomie 25,0 punktów z każdej strony.


8

Opierałem się na rozwiązaniu Nate'a, ale potem odkryłem, że powoduje to problemy, gdy używasz właściwości leftView / rightView, więc lepiej dostrój implementację super, ponieważ weźmie ona pod uwagę lewy / prawy widok.

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

Zaktualizowana wersja dla 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

Ustaw wypełnianie dla UITextField za pomocą UITextBorderStyleNone: Swift

Na podstawie najbardziej głosowanej odpowiedzi @Evil Trout stworzyłem niestandardową metodę w mojej klasie ViewController, jak pokazano poniżej:

- (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]];
}

Teraz mogę wywołać tę metodę wewnątrz (metoda viewDidLoad) i wysłać dowolny z moich TextFields do tej metody i dodać dopełnienie dla prawej i lewej strony oraz podać kolory tekstu i tła, pisząc tylko jedną linię kodu w następujący sposób:

[self modifyTextField:self.firstNameTxtFld];

Działa to doskonale na iOS 7! Wiem, że dodanie zbyt dużej liczby widoków może spowodować, że ta klasa będzie nieco cięższa do załadowania. Ale zaniepokojony trudnością związaną z innymi rozwiązaniami, byłem bardziej stronniczy w stosunku do tej metody i bardziej elastyczny w używaniu tej metody. ;)

Dzięki za Hack „Evil Trout”! (kokarda)

Pomyślałem, że powinienem zaktualizować fragment kodu tej odpowiedzi za pomocą Swift:

Ponieważ Swift pozwala nam pisać rozszerzenia dla istniejących klas, napiszmy to w ten sposób.

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

Stosowanie:

self.firstNameTxtFld.addPaddingToTextField()

Mam nadzieję, że pomogłoby to komuś innemu!
Twoje zdrowie!


5

Oto jak to osiągnąć w 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
}
}

Ratunek


5

Wersja Swift 2.0:

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

4

^ te sugestie są świetne dla tych, którzy programowo tworzą interfejs.

Ale dla tych z nas, którzy używają konstruktora interfejsu Xcode, są dwa LUŹNE ŁATWE SPOSOBY:

  • łatwiej: umieść UIImageView za polem tekstowym

  • najłatwiej: zmień styl obramowania na prosty czarny kwadrat (drugi od lewej opcji), a następnie dodaj obraz jako obraz tła. Obraz ma pierwszeństwo przed kwadratem, więc nadal dostajesz wypełnienie potrzebne do normalnego tła obrazu, bez faktycznego narysowania kwadratu.

EDYCJA: możesz również użyć czarnej kuli (trzecia od lewej opcja przy wybieraniu UITextBox w IB), nie działa ona w skrajnie prawym stylu „kuli graficznej”.


W niektórych przypadkach Twoje łatwiejsze rozwiązanie jest rzeczywiście prawidłowym wyborem, ale najłatwiejszym rozwiązaniem jest włamanie, które również nie działa, jeśli piksele krawędzi obrazu mają zmienną alfa (nie wspominając o tym, że Apple może zmienić ich implementację w przyszłej wersji iOS).
jmdecombe

Nie zgadzam się z tobą - dlatego wpisuję „leniwy łatwy sposób” na wszystkie litery wielkich liter. Do tej pory działało mi dobrze.
woody121

4

Jeśli ktoś szuka Swift 4.0wersji, poniżej extensionjest praca. Posiada zarówno Lefti Rightdopełnienie dla UITextField. W rzeczywistości jest to IBInspectablekonfiguracja scenorysu. Możesz ustawić wartość bezpośrednio z Konstruktora interfejsów / Storyboard. Jest to testowany kod w wersji Swift 4.0 i Xcode 9.0

Pamiętaj, że jeśli chcesz włączyć Clear Buttonto samoUITextField musisz pozostawić Right Padding puste.

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

Najlepszym sposobem na to jest utworzenie klasy za pomocą podklasy UITextField i pliku .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;

 }

w ten sposób przejdź do swojej serii ujęć lub Xib i kliknij Inspektora tożsamości i zastąp UITextfield własną opcją „CustomTextField” w klasie.

Uwaga: jeśli po prostu podasz dopełnienie z automatycznym układem pola tekstowego, aplikacja nie będzie działać i wyświetli się tylko pusty ekran.


3

Wersja 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

Odpowiedź Nate Flink jest moją ulubioną, ale nie zapominaj o widokach z prawej / lewej strony. Np. Dla UITextFieldpodklasy:

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

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

Powyższy kod tuż za wyściółkę rightViewz UITextField.


2

Rozwiązanie 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

Oto kod Swift, który podaje padding w polu UIText

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

i dzwoń za pomocą

self.txtPaddingVw(txtPin)

2

możesz użyć kategorii. ustaw padding w lewo i prawo

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

możesz ustawić padding w ten sposób self.phoneNumTF.paddingValue = 10.f; lub self.phoneNumTF.leftPadding = 10.f;


1

Odpowiedź @ Evil pstrąga jest świetna. Używam tego podejścia od dłuższego czasu. Jedyne, czego brakuje, to „radzenie sobie z wieloma polami tekstowymi”. Próbowałem innych metod, ale nie działa.

Podklasowanie UITextField po prostu dodanie dopełnienia nie miało dla mnie sensu. Powtórzyłem wszystkie pola UITextField, aby dodać dopełnienie.

-(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]];
        }
    }
}

metodę można wywołać przez [self addPaddingToAllTextFields: [self view]];
Kishor Kundan

Ponieważ textfieldarraynie jest zdefiniowana w drugim ifbloku, kiedyś ten fragment (dzięki!) Z powodzeniem po wymianie zawartość drugiego ifzfor(id subSubView in [view subviews]){[self addPaddingToAllTextFields:subSubView];}
adamup

1

Rozwiązanie Brody działało idealnie dla mnie. Musiałem dodać widoki z boku na polu tekstowym i dodać dodatkowe wypełnienie. Dzięki wdrożeniu niestandardowej właściwości UIEdgeInsets do podklasy UITextField udało mi się osiągnąć to zadanie. Użyję tej nowej podklasy we wszystkich moich projektach.


1

Najlepszym rozwiązaniem, jakie do tej pory znalazłem, jest kategoria. W ten sposób dodaję 5-punktowe wypełnienie po lewej i prawej stronie:

@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

# Pragma służy tylko do usuwania irytujących ostrzeżeń


Problem z przeciążeniem metod w kategoriach polega na tym, że zostanie oznaczony jako nieużywany w AppCode, którym jest w rzeczywistości. Dobry pomysł, ale niezbyt bezpieczny, ponieważ można go łatwo usunąć po uruchomieniu „Optymalizuj importowanie” (nie ma problemu dla użytkowników Xcode, ale wszyscy znamy ograniczone funkcje zorientowane na kod)
Sebastian Wramba

1
Czy to prosta kategoria, która zastosuje dopełnianie dla wszystkich pól tekstowych w aplikacji?
Ben Sinclair

@Andy nie dotyczy to tylko podczas importowania, musisz utworzyć klasę UITextField + Padding i zaimportować go do kontrolera widoku lub klasy, która ma pole
tekstowe

@MongiZaidi: jesteś w błędzie. Jest łączony z plikiem wykonywalnym, niezależnie od tego, czy importowanie jest nieistotne.
Zsolt Szatmari,

1
textField.layer.borderWidth = 3;

doda obramowanie, które działało dla mnie jako wypełnienie.


0

Inną kwestią jest to, że jeśli masz więcej niż jedno miejsce, w UITextFieldktórym dodajesz dopełnienie, jest utworzenie osobnego UIViewdla każdego pola tekstowego - ponieważ nie można ich udostępniać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.