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?

Sebastian Wramba
źródło

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
Zły Pstrąg
źródło
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)
    }
}
Nate Flink
źródło
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

bandejapaisa
źródło
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

Inder Kumar Rathore
źródło
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
Brody Robertson
źródło
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.

Camsoft
źródło
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

Kirit Vaghela
źródło
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ł

777Q
źródło
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

Paulo Miguel Almeida
źródło
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

superarts.org
źródło
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.

Thomas Clayson
źródło
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.

King-Wizard
źródło
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];
}
Stoto
źródło
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)
    }
}
Beninho85
źródło
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!

Randika Vishman
źródło
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

DrPatience
źródło
5

Wersja Swift 2.0:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;
Phil
źródło
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”.

woody121
źródło
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     
        }
    }
}  
Bhavin_m
źródło
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.

Anuj Kumar Rai
źródło
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)
    }
}
王怡飞
źródło
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.

rafalkitta
źródło
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)
 }
}
Ben Sullivan
źródło
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)
Hardik Thakkar
źródło
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;

rikiluo
źródło
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]];
        }
    }
}
Kishor Kundan
źródło
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.

Lubakis
źródło
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ń

Mongi Zaidi
źródło
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.

Saqib Saud
źródło
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ć.

użytkownik1686700
źródło