UITextBorderStyleNone के साथ UITextField के लिए पैडिंग सेट करें


398

मैं अपने लिए एक कस्टम पृष्ठभूमि का उपयोग करना चाहता था UITextFields। यह इस तथ्य को छोड़कर ठीक काम करता है कि मुझे UITextBorderStyleNoneइसे सुंदर दिखने के लिए उपयोग करना है। यह पाठ को बिना किसी पैडिंग के बाईं ओर चिपकाने के लिए मजबूर करता है।

क्या मैं मैन्युअल रूप से एक पैडिंग सेट कर सकता हूं ताकि यह UITextBorderStyleRoundedRectमेरी कस्टम पृष्ठभूमि छवि का उपयोग करने के लिए समान हो ?

जवाबों:


837

मुझे इस सटीक स्थिति के लिए बाएं पैडिंग सेट करने के लिए एक नीरस छोटी हैक मिली।

मूल रूप से, आप बाएं दृश्य गुण सेट UITextFieldकरना चाहते हैं जो आप चाहते हैं कि गद्दी के आकार का एक खाली दृश्य हो:

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

मेरे लिए एक जादू की तरह काम किया!

में स्विफ्ट 3 / स्विफ्ट 4 , यह है कि ऐसा करने से किया जा सकता है

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

1
वास्तव में मुझे क्या चाहिए, सिवाय इसके कि मुझे दाईं ओर पैडिंग की जरूरत है जो कि ज्यादातर एक ही है, बिल्कुल। धन्यवाद!
सी.जी.

@ लुकाज़ I ने इस उत्तर में एक ऑटोरेलिज़ जोड़ा, स्वीकृत उत्तर। पहली पंक्ति। संपादित करें: उफ़, शायद मैं नहीं बचा? या मेरा संपादन अस्वीकार कर दिया गया था? किसी भी तरह से, विन्सेन्ट ने एक ऑटोरेलिज़ में जोड़ा, इसलिए उसके लिए याय!
एरिक गोल्डबर्ग

1
ARC का उपयोग करते हुए, यदि मैं *paddingViewकई टेक्स्ट फ़ील्ड के साथ पुन: उपयोग करता हूं, तो मेरा ऐप क्यों लटका हुआ है और बहुत से सीपीयू का उपयोग करता है?
मफिन मैन

3
यह एक बुरा समाधान है, नैट फ्लिंक के लिए बेहतर है। थियोस एक में एडिशन मोड पैडिंग शामिल नहीं है।
जसक क्विएसीń

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। फिर भी, ऐसा लगता है जैसे एक पाठ क्षेत्र के अंदर पैडिंग को नियंत्रित करने में सक्षम नहीं होने के लिए कुछ गायब है।

स्विफ्ट 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
@ शाश्वत हां, आप अपनी इच्छानुसार कोई भी पैडिंग निर्दिष्ट कर सकते हैं
ईजी अकपिनार

1
जब मैंने 4 साल पहले इसे जोड़ा था, तो आईओएस के साथ चीजें अलग थीं, और मैं मानता हूं कि अब सबक्लास बनाना सबसे अच्छा है। हालाँकि, यदि आप केवल अपनी पिक्सेल दूरी का नेत्रहीन निरीक्षण करने के लिए एक तेज़ और गंदा तरीका चाहते हैं, तो यह ऐसा करेगा;) तो लोगों के लिए मतदान ठीक है !!
नैट फ्लिंक

139

Xcode> 6 के लिए एक स्विफ्ट 3 संस्करण, जहां आप इंटरफ़ेस बिल्डर / स्टोरीबोर्ड में इनसेट मान को संपादित कर सकते हैं।

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 आपको अपने टेक्स्टफ़ील्ड पर क्लिक करने और क्लास को फॉर्मटेक्लेट में बदलने की ज़रूरत है
गुस्तावो बारबोसा

77

संपादित करें: अभी भी iOS 11.3.1 में काम करता है

IOS 6 myTextField.leftView = paddingView;में समस्या पैदा कर रहा है

इससे समस्या हल हो जाती है

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

टिप्पणियों में लैटेनिटकोडरCATransform3DMakeTranslation(-5, 0, 0) द्वारा उल्लेख के रूप में सही संरेखित पाठ क्षेत्र का उपयोग करें


1
अच्छा, मुझे ऐप के सभी टेक्स्टफील्ड्स में पैडिंग डालनी थी, मैंने UITextField की एक श्रेणी बनाई और इस कोड को अंदर डाल दिया - (शून्य) awakeFromNib {} और इसने मेरी समस्या हल कर दी
Teena nad Paul

बहुत आसन! Thx :) मेरे पास एक सवाल है कि मैं कई बार कोड लिखने के बजाय सभी UITextField बनाने के लिए एक सरल कोड कैसे बना सकता हूं?
लुआ कलकतवी

1
अन्य सभी टिप्पणियां मानती हैं कि आप बाईं ओर से UITextField को पैड करना चाहते हैं। सब स्पेसिंग ओवरहेडिंग है, कुछ रिक्ति आईडी जोड़ने के लिए सिर्फ कुछ खाली अक्षर जोड़ना है लेकिन यह समाधान है। एक पंक्ति भविष्य का प्रमाण। यदि आप एक टेक्स्टफील्ड के साथ काम कर रहे हैं जो कि टेक्स्ट राइट एलायंस यूज़ माइनस वैल्यू है (-5,0,0) धन्यवाद इंदर
latenitecoder

1
4yrs के बाद मुझे अपना जवाब मिला: D, @latenitecoder आपकी टिप्पणी जो आवश्यक थी। उत्तर को अद्यतन करते हुए
इंद्र कुमार राठौर

1
अगर मैं दाएं और बाएं दोनों पैडिंग चाहता हूं तो मैं क्या कर सकता हूं ??
मीना हन्ना

70

UITextField में पैडिंग जोड़ने के लिए एक अच्छा तरीका है सबक्लास को जोड़ना और एक किनारे संपत्ति जोड़ना। फिर आप किनारे सेट करते हैं और UITextField तदनुसार तैयार किया जाएगा। यह कस्टम बाएँ दृश्य या दाएँ दृश्य सेट के साथ सही रूप से कार्य करेगा।

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

बस उपवर्ग इस तरह से:

@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

ईविल ट्राउट के जवाब के आधार पर आप कई अनुप्रयोगों में उपयोग करना आसान बनाने के लिए एक श्रेणी बना सकते हैं।

शीर्ष लेख फ़ाइल:

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

ताकि आप IB में मान प्रदान कर सकें

इंटरफ़ेस बिल्डर में IBInspectable सेटिंग का प्रतिनिधित्व किया


IBInspectableआपको रनटाइम पर सेटर कोड लागू करने की अनुमति देता है, इसलिए बस अपना नंबर डालें Interface Builderऔर यह काम करेगा।
superarts.org

जब आपके पास यह काम नहीं करेगा Clear Button। इस समाधान को लागू करने पर आपका स्पष्ट बटन दिखाई नहीं देगा।
भाविन_

11

आप पैडिंग सेट नहीं कर सकते। इसके बजाय UIViewआपकी पृष्ठभूमि छवि और उसके UITextFieldअंदर की जगह है। सेट UITextFieldके रूप में चौड़ाई UIViewWidth-(paddingSize x 2)और ऊंचाई इसी तरह और फिर बिंदु पर यह सेट paddingSize,paddingSize


9

बस उपवर्ग UITextField इस तरह ( स्विफ्ट संस्करण ):

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

मैं नैट के समाधान पर आधारित था, लेकिन फिर मैंने पाया कि जब आप बाएं दृश्य / दाएँ दृश्य गुणों का उपयोग करते हैं, तो यह समस्या पैदा करता है, इसलिए इसका बेहतर सुपर कार्यान्वयन है, क्योंकि यह बाएँ / दाएँ दृश्य को ध्यान में रखेगा।

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

स्विफ्ट 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

UITextBorderStyleNone के साथ UITextField के लिए पैडिंग सेट करें: स्विफ्ट

@Evil ट्राउट के सबसे अधिक मत वाले उत्तर के आधार पर मैंने अपने ViewController वर्ग में एक कस्टम विधि बनाई, जैसे दिखाया गया bellow:

- (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 पर काम करता है! मुझे पता है कि बहुत अधिक दृश्य जोड़ने से यह थोड़ा भारी वर्ग हो सकता है। लेकिन जब अन्य समाधानों में कठिनाई के बारे में चिंतित हूं, तो मैंने खुद को इस पद्धति के लिए अधिक पक्षपाती पाया और इस तरह से उपयोग करने के साथ अधिक लचीला। ;)

हैक "ईविल ट्राउट" के लिए धन्यवाद! (धनुष)

मुझे लगा कि मुझे स्विफ्ट के साथ इस उत्तर का कोड स्निपेट अपडेट करना चाहिए:

चूंकि स्विफ्ट हमें मौजूदा कक्षाओं के लिए एक्सटेंशन लिखने की अनुमति देता है, तो हम इसे इस तरह से लिखते हैं।

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

स्विफ्ट 2.0 संस्करण:

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

4

^ ये सुझाव उन लोगों के लिए महान हैं जो प्रोग्रामेटिक रूप से एक इंटरफ़ेस बना रहे हैं।

लेकिन हम में से उन दोनों के लिए दो आसान तरीके हैं जो Xcode इंटरफ़ेस बिल्डर का उपयोग करते हैं:

  • आसान: एक पाठ क्षेत्र के पीछे एक UIImageView रखो

  • सबसे आसान: बॉर्डर स्टाइल को सरल ब्लैक स्क्वायर (बाएं विकल्प से दूसरा) पर बदलें, फिर अपनी छवि को पृष्ठभूमि छवि के रूप में जोड़ें। छवि वर्ग पर पूर्वता लेती है, इसलिए आपको अभी भी एक सामान्य छवि पृष्ठभूमि के लिए आवश्यक पैडिंग मिलती है, बिना वर्ग वास्तव में खींचा जा रहा है।

संपादित करें: आप काले गोले का उपयोग कर सकते हैं (बाएं विकल्प से तीसरा जब IB में UITextBox का चयन करते हैं), तो यह बहुत दाईं ओर "चित्रमय क्षेत्र" शैली के साथ काम नहीं करता है।


आपका आसान समाधान वास्तव में कुछ मामलों में एक वैध विकल्प है, लेकिन आपका सबसे आसान समाधान एक हैक है, जो कि आपकी छवि के किनारे के पिक्सल में परिवर्तनशील अल्फा नहीं होने पर भी काम नहीं करता है (इसका उल्लेख नहीं है कि एप्पल भविष्य में आईओएस रिलीज में अपने कार्यान्वयन को बदल सकता है)।
jmdecombe

मैं आपसे असहमत नहीं हूँ - यही कारण है कि मैंने सभी कैप्स पत्रों में "आलसी आसान तरीका" डाला। यह मेरे लिए आज तक ठीक काम किया है।
woody121

4

अगर किसी को Swift 4.0संस्करण की तलाश है तो नीचे extensionकाम है। इसके लिए दोनों Leftऔर Rightपैडिंग है UITextField। दरअसल यह IBInspectableस्टोरीबोर्ड कॉन्फ़िगरेशन के लिए है। आप इंटरफ़ेस बिल्डर / स्टोरीबोर्ड से सीधे मान सेट कर सकते हैं। यह स्विफ्ट 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

इसका सबसे अच्छा तरीका यह है कि यूआईटैक्सफ़िल्ड और .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 को वर्ग विकल्प में बदलें।

नोट: यदि आप केवल टेक्स्टफील्ड के लिए ऑटो लेआउट के साथ पैडिंग देते हैं तो आपका एप्लिकेशन नहीं चलेगा और केवल खाली स्क्रीन दिखाएगा।


3

स्विफ्ट 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

स्विफ्ट 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

यहाँ 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 की तरह पैडिंग सेट कर सकते हैं ; or 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]];
        }
    }
}

विधि [आत्म addPaddingToAllTextFields: [आत्म दृश्य]] द्वारा बुलाया जा सकता है;
किशोर कुंदन

के बाद से 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

# प्रज्ञा केवल कष्टप्रद चेतावनियों को दूर करने के लिए हैं


श्रेणियों में विधि अधिभार के साथ बात यह है कि इसे ऐपकोड में अप्रयुक्त के रूप में चिह्नित किया जाएगा, जो कि वास्तव में है। अच्छा विचार, लेकिन बहुत सुरक्षित नहीं है क्योंकि यह आसानी से हटा दिया जाता है जब आप "ऑप्टिमाइज़ इम्पोर्ट" चलाते हैं (हालांकि Xcode उपयोगकर्ताओं के लिए कोई समस्या नहीं है, लेकिन हम सभी सीमित कोड-केंद्रित सुविधाओं को जानते हैं)
सेबस्टियन रेम्बा

1
क्या यह एक साधारण बमर श्रेणी है जो ऐप में सभी टेक्स्ट फ़ील्ड के लिए पैडिंग लागू करेगा?
बेन सिंक्लेयर

@ और नहीं, यह केवल तभी लागू होता है जब आप इसे आयात करते हैं, आपको एक वर्ग UITextField + Padding बनाना होगा और इसे उस
दृश्य केंद्र

@ मोंजीजैडी: आप गलत हैं। यह निष्पादन योग्य से जुड़ा हुआ है, चाहे आयात किया जा रहा हो अप्रासंगिक।
Zsolt Szatmari

1
textField.layer.borderWidth = 3;

सीमा जोड़ देगा, जो मेरे लिए पैडिंग का काम करती थी।


0

एक और विचार यह है कि, यदि आपके पास एक से अधिक है UITextFieldजहाँ आप पैडिंग जोड़ रहे हैं, तो UIViewप्रत्येक टेक्स्टफील्ड के लिए एक अलग बनाना है - क्योंकि वे साझा नहीं किए जा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.