iPhone UITextField - प्लेसहोल्डर टेक्स्ट कलर बदलें


566

मैं अपने UITextFieldनियंत्रण में निर्धारित प्लेसहोल्डर पाठ का रंग बदलना चाहता हूं , इसे काला बनाने के लिए।

मैं प्लेसहोल्डर के रूप में सामान्य पाठ का उपयोग किए बिना और प्लेसहोल्डर के व्यवहार की नकल करने के लिए सभी तरीकों को ओवरराइड करने के बिना करना चाहता हूं।

मेरा मानना ​​है कि अगर मैं इस विधि को ओवरराइड करता हूं:

- (void)drawPlaceholderInRect:(CGRect)rect

तब मुझे यह करने में सक्षम होना चाहिए। लेकिन मैं अनिश्चित हूं कि इस विधि के भीतर से वास्तविक प्लेसहोल्डर ऑब्जेक्ट तक कैसे पहुंचा जाए।

जवाबों:


804

IOS 6 में UIViews में जिम्मेदार स्ट्रिंग्स की शुरूआत के बाद से, इस तरह के प्लेसहोल्डर टेक्स्ट को कलर असाइन करना संभव है:

if ([textField respondsToSelector:@selector(setAttributedPlaceholder:)]) {
  UIColor *color = [UIColor blackColor];
  textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholderText attributes:@{NSForegroundColorAttributeName: color}];
} else {
  NSLog(@"Cannot set placeholder text's color, because deployment target is earlier than iOS 6.0");
  // TODO: Add fall-back code to set placeholder color.
}

2
यह अच्छा है - लेकिन याद रखें कि आपको आईबी में प्लेसहोल्डर मान सेट करने से पहले यह काम करना होगा
gheese

4
इसके जवाब में यह भी लपेटने लायक है। इसे कॉल करने वाले के रूप में - इसके बिना यह कोड प्री 6.0 परिनियोजन टारगेट पर दुर्घटनाग्रस्त हो जाएगा (गैर-मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा गया)
gheese

5
attributedPlaceholderरंग के अलावा, पाठ विशेषताओं का उपयोग करने वाले शब्दों के लिए डॉक्स ।
मैट कोनोली

1
किसी भी विचार क्यों यह विशेषता के लिए काम नहीं कर रहा है - NSFontAttributeName [[NSAttributedString alloc] initWithString:@"placeholder" attributes: @{NSForegroundColorAttributeName: color, NSFontAttributeName : font}];
dev4u

3
IOS 7 पर मुझे यह त्रुटि मिली:[<UITextField 0x11561d90> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _field.
i_am_jorf

237

आसान और दर्द से मुक्त, कुछ के लिए एक आसान विकल्प हो सकता है।

_placeholderLabel.textColor

उत्पादन के लिए सुझाव नहीं दिया गया, Apple आपकी अधीनता को अस्वीकार कर सकता है।


1
क्या आप उत्पादन में इसका उपयोग कर रहे हैं? मेरा मतलब है कि निजी संपत्ति का उपयोग करना।
गेरी बोरबस

11
हो सकता है कि फास्ट कॉपी और पेस्ट के लिए अपने उत्तर में टेक्स्ट जोड़ें। _placeholderLabel.textColor
Philiiiiiipp

47
इस पद्धति का उपयोग न करें, मैंने इसका और itune स्टोर का उपयोग किया है, मेरे आवेदन को अस्वीकार कर दिया है।
असद अली

1
मुझे लगता है कि किसी भी तरह की निजी पुस्तकालय पद्धति को किसी भी चीज के समाधान के रूप में अनुशंसित नहीं किया जाना चाहिए
Sk

2
@jungledev _placeholderLabelएक निजी संपत्ति है। यह समाधान निजी एपीआई के उपयोग के लिए अस्वीकार किए जाने के अधीन है।
शॉन क्लैडक

194

आप drawPlaceholderInRect:(CGRect)rectप्लेसहोल्डर टेक्स्ट को मैन्युअल रूप से रेंडर करने के लिए इस तरह ओवरराइड कर सकते हैं :

- (void) drawPlaceholderInRect:(CGRect)rect {
    [[UIColor blueColor] setFill];
    [[self placeholder] drawInRect:rect withFont:[UIFont systemFontOfSize:16]];
}

44
[self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];शायद कुछ बेहतर है। इस तरह से आप textAlignmentसंपत्ति का सम्मान करेंगे । मैंने इसे अपने SSTextField वर्ग में शामिल कर लिया है। अपनी परियोजनाओं में उपयोग करने के लिए स्वतंत्र महसूस करें।
सैम सोफेस

52
कोटेग ने जो कहा, वह बिल्कुल नहीं है। कभी भी श्रेणियों के माध्यम से तरीकों को ओवरराइड करें। एवर
जोशुआ वेनबर्ग

8
@JoshuaWeinberg आपके आत्महत्या के पीछे कोई विशेष कारण है।
कृष्णायन

5
@ कृष्णन ने एक श्रेणी में एक डुप्लिकेट विधि को लागू करने का समर्थन नहीं किया है, और आप कभी भी निश्चित नहीं हो सकते हैं कि किस पद्धति को बुलाया जाएगा, या यदि दोनों को बुलाया जाएगा, या जिस क्रम में उन्हें बुलाया जाएगा।
शॉन वुडवर्ड

8
IOS7 में आप पाठ को वर्टीकल सेंटर करने के लिए CGRectInset (रेक्ट, 0, (rect.size.height - self.font.lineHeight) / 2.0) का उपयोग करके रीट को बदल सकते हैं।
ब्रायन एस

170

आप नीचे दिए गए कोड का उपयोग करके किसी भी रंग को प्लेसहोल्डर टेक्स्ट कलर बदल सकते हैं।

UIColor *color = [UIColor lightTextColor];
YOURTEXTFIELD.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"PlaceHolder Text" attributes:@{NSForegroundColorAttributeName: color}];

6
सर्वोत्तम उत्तर सुझाया गया। कार्य करता है, और प्रलेखित एपीआई का उपयोग करता है।
इयान होवर

2
आप UISearchBar के लिए यह काम कैसे करेंगे? कोई जिम्मेदार नहीं है।
gilsaints88

1
यह उत्तर सही नहीं है - डॉक्स के अनुसार, एट्रैडप्लासहोल्डर की टेक्स्ट कलर जानकारी को नजरअंदाज कर दिया गया है। डेवलपर
.apple.com/library

सभी को धन्यवाद। आशा है कि यह कुछ मदद की थी। Adlai Holler यह एक कोशिश भाई दे !!! यह उत्तर iOS के पिछले संस्करण के लिए था। यदि आपके पास बेहतर उत्तर है तो हम सुझाव के लिए खुले हैं।
मंजू

IOS8 पर काम नहीं करता है क्योंकि इसमें कोई जिम्मेदार नहीं है। संपत्ति का मालिक नहीं है
बेन क्लेटन

157

हो सकता है कि आप इस तरह से प्रयास करना चाहते हों, लेकिन Apple आपको निजी आइवर एक्सेस करने के बारे में चेतावनी दे सकता है:

[self.myTextField setValue:[UIColor darkGrayColor] 
                forKeyPath:@"_placeholderLabel.textColor"];

नोट
मार्टिन एलियस के अनुसार, यह अब iOS 7 पर काम नहीं कर रहा है।


6
मैं अपने ऐप में इस विधि का उपयोग करता हूं। समीक्षा ठीक थी। इसलिए मुझे लगता है कि इसका इस्तेमाल करना ठीक है।
माइकल ए।

9
यह ऐप स्टोर सुरक्षित नहीं है और इसे प्रोत्साहित नहीं किया जाना चाहिए , आपको इन तकनीकों के साथ अनुमोदित होने या स्वीकृत रहने की गारंटी नहीं है।
स्वीनुंग कवल बक्केन

31
यह वास्तव में कोई फर्क नहीं पड़ता अगर यह स्वीकृत है या वास्तव में नहीं है। महत्वपूर्ण बात यह है कि यह आपके ऐप को भविष्य के ओएस अपडेट में तोड़ सकता है।
पाबलासो

2
आईओएस 7 के साथ कोई समस्या नहीं है ... मैंने इसे नोट के बावजूद कोशिश की और यह ठीक काम करने लगता है और मैंने अतीत में बिना किसी समस्या के इस दृष्टिकोण का उपयोग किया है।
WCByrne

6
यह हमेशा एक बुरा विचार था, और अब यह iOS 13: Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bugRy
राइडर मैके

153

यह स्विफ्ट <3.0 में काम करता है:

myTextField.attributedPlaceholder = 
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])

IOS 8.2 और iOS 8.3 बीटा 4 में परीक्षण किया गया।

स्विफ्ट 3:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSForegroundColorAttributeName : UIColor.red])

स्विफ्ट 4:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedStringKey.foregroundColor: UIColor.red])

स्विफ्ट 4.2:

myTextfield.attributedPlaceholder =
NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

IOS8.2 पर अपने समाधान का उपयोग करना, एक आकर्षण की तरह काम करता है। यहाँ सही समाधान। उद्देश्य सी में भी उपयोग करना।
अक्षत झवेरी

73

स्विफ्ट में:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
}

स्विफ्ट 4.0 में:

if let placeholder = yourTextField.placeholder {
    yourTextField.attributedPlaceholder = NSAttributedString(string:placeholder, 
        attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])
}

यदि आपने प्लेसहोल्डर टेक्स्ट को कॉल करने से पहले सेट नहीं किया है तो यह एप को क्रैश कर देगा
Apinho

यह सबसे अच्छा है, धन्यवाद। @apinho यहां दुर्घटनाग्रस्त नहीं होगा
मार्कस

// स्विफ्ट 4 में अगर प्लेसहोल्डर = yourTextField.placeholder {yourTextField.attributedPlaceholder = NSAttributedString (स्ट्रिंग: प्लेसहोल्डर, विशेषताएँ: [NSAttributedStringKey.foregroundColor: UIColor.white]}}
रोनाल्डो अल्बर्टिनी

इस कोड के निष्पादित होने के बाद प्लेसहोल्डर पाठ मान को बदलने से सावधान रहें, डिफ़ॉल्ट प्लेसहोल्डर रंग वापस लाएगा।
एलेसेंड्रो वेंडरसकोलो 15

66

स्विफ्ट 3.0 + स्टोरीबोर्ड

स्टोरीबोर्ड में प्लेसहोल्डर रंग बदलने के लिए, अगले कोड के साथ एक एक्सटेंशन बनाएं। (इस कोड को अपडेट करने के लिए स्वतंत्र महसूस करें, यदि आपको लगता है कि यह स्पष्ट और सुरक्षित हो सकता है)।

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            guard let currentAttributedPlaceholderColor = attributedPlaceholder?.attribute(NSForegroundColorAttributeName, at: 0, effectiveRange: nil) as? UIColor else { return UIColor.clear }
            return currentAttributedPlaceholderColor
        }
        set {
            guard let currentAttributedString = attributedPlaceholder else { return }
            let attributes = [NSForegroundColorAttributeName : newValue]

            attributedPlaceholder = NSAttributedString(string: currentAttributedString.string, attributes: attributes)
        }
    }
}

यहाँ छवि विवरण दर्ज करें

स्विफ्ट 4 संस्करण

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedStringKey: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

स्विफ्ट 5 संस्करण

extension UITextField {
    @IBInspectable var placeholderColor: UIColor {
        get {
            return attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor ?? .clear
        }
        set {
            guard let attributedPlaceholder = attributedPlaceholder else { return }
            let attributes: [NSAttributedString.Key: UIColor] = [.foregroundColor: newValue]
            self.attributedPlaceholder = NSAttributedString(string: attributedPlaceholder.string, attributes: attributes)
        }
    }
}

संकलक पता नहीं लगा सकता NSAttributedStringKey
मिलन कामिल्या

आईओएस 13 में काम करता है
जलील

43

केवल iOS6 + के साथ निम्नलिखित (जैसा कि अलेक्जेंडर डब्ल्यू की टिप्पणी में संकेत दिया गया है):

UIColor *color = [UIColor grayColor];
nameText.attributedPlaceholder =
   [[NSAttributedString alloc]
       initWithString:@"Full Name"
       attributes:@{NSForegroundColorAttributeName:color}];

33

मैं पहले ही इस मुद्दे का सामना कर चुका था। मेरे मामले में नीचे कोड सही है।

उद्देश्य सी

[textField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];

स्विफ्ट 4.X के लिए

tf_mobile.setValue(UIColor.white, forKeyPath: "_placeholderLabel.textColor")

IOS 13 स्विफ्ट कोड के लिए

tf_mobile.attributedPlaceholder = NSAttributedString(string:"PlaceHolder Text", attributes: [NSAttributedString.Key.foregroundColor: UIColor.red])

आप iOS 13 के लिए नीचे दिए गए कोड का भी उपयोग कर सकते हैं

let iVar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")!
let placeholderLabel = object_getIvar(tf_mobile, iVar) as! UILabel
placeholderLabel.textColor = .red

आशा है, यह आपकी मदद कर सकता है।


@Ashu के कारण ios 13 में क्रैश हो जाता है 'UITextField के _placeholderLabel ivar तक पहुँच निषिद्ध है। यह एक आवेदन बग है 'यह भी अभ्यस्त होना चाहिए मैं AppStore में रखने के बारे में बात नहीं कर रहा हूँ
मेलानी

1
IOS 13 यह प्रतिबंधित था अब इसका इस्तेमाल नहीं कर सकते हैं
किशोर कुमार

Objc कोड IOS 13 पर परीक्षण किया गया है और काम नहीं कर रहा है।
मेहदिको

1
@ मेढिको I ने iOS 13. के लिए उत्तर को अपडेट किया। आशा है कि यह आपकी मदद करेगा।
आशु

मुझे खुशी है कि मैं में यह परिवर्तन करने के लिए किया था लंबे समय तक भी ले लिया viewWillAppearया viewDidAppearviewDidLoadकाफी जल्दी है।
चार

32

इसके साथ हम iOS में टेक्स्टफील्ड के प्लेसहोल्डर टेक्स्ट का रंग बदल सकते हैं

[self.userNameTxt setValue:[UIColor colorWithRed:41.0/255.0 green:91.0/255.0 blue:106.0/255.0 alpha:1.0] forKeyPath:@"_placeholderLabel.textColor"];

1
IOS13 से शुरू यह काम नहीं करेगा
टेडी

@ टेडी तुमने अभी कैसे किया? मुझे इससे समस्या होने लगी।
जलील

@ जलील मुझे उम्मीद है कि मैं अभी भी आपके लिए समय पर हूं। textField।
टेडी

18

आप सिर्फ UIAppearanceविधि का उपयोग क्यों नहीं करते हैं :

[[UILabel appearanceWhenContainedIn:[UITextField class], nil] setTextColor:[UIColor whateverColorYouNeed]];

बहुत अच्छा काम करता है! पाठ का रंग प्रभावित नहीं होता है (कम से कम अलग-अलग प्रॉक्सी के साथ टेक्स्टलोर प्रॉपर्टी के लिए)
हॉटजार्ड

18

आपके स्टोरीबोर्ड में भी, कोड की एक भी पंक्ति के बिना

यहाँ छवि विवरण दर्ज करें


1
यह आपको कैसे पता चलेगा? मुझे लगता है कि यह सबसे अच्छा तरीका है, लेकिन कोई इसे कैसे जान सकता है? कृपया बताएं कि मैं ios प्रोग्रामिंग के लिए नया हूं।
यवर

2
यह बहुत सार्वभौमिक है। एक बार जब आप जानते हैं कि यह हर जगह इसका इस्तेमाल करता है;)
पेट्र सिरोव

मुझे पता है कि एक बार मैं समझ गया कि इसके पीछे क्या चल रहा है तो मैं इसका भरपूर उपयोग करने जा रहा हूं। लेकिन मेरा मतलब है "_placeholderLabel.textColor" यह टेक्स्टफील्ड का एक बच्चा दृश्य होना चाहिए। क्या नियंत्रण के बारे में इस प्रकार की जानकारी देखने का कोई तरीका है?
यवर

2
@ यवर आप Xcode में पदानुक्रम निरीक्षक का उपयोग कर सकते हैं, या डीबगर में दृश्य को अंतःस्थापित कर सकते हैं।
डेविड गैंस्टर


16

स्विफ्ट में 3.X

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes:[NSForegroundColorAttributeName: UIColor.black])

तेजी से 5 में

textField.attributedPlaceholder = NSAttributedString(string: "placeholder text", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black])

12

IOS 6.0 + के लिए

[textfield setValue:your_color forKeyPath:@"_placeholderLabel.textColor"];

आशा है ये मदद करेगा।

नोट: Apple आपके एप्लिकेशन को अस्वीकार कर सकता है (0.01% संभावना) जब हम निजी API एक्सेस कर रहे हैं। मैं दो साल से अपनी सभी परियोजनाओं में इसका उपयोग कर रहा हूं, लेकिन Apple ने इसके लिए नहीं कहा।


terminating with uncaught exception of type NSExceptioniOS8 के लिए फेंकता है
यार

10

Xamarin.iOS डेवलपर्स के लिए, मैंने इसे इस दस्तावेज़ से पाया https://developer.xamarin.com/api/type/Foundation.NSAttributedString/

textField.AttributedPlaceholder = new NSAttributedString ("Hello, world",new UIStringAttributes () { ForegroundColor =  UIColor.Red });

धन्यवाद !! मैं पहली बार CTStringAttributes का उपयोग कर रहा था और UIStringAttributes का नहीं। इसका उपयोग न करने के लिए सावधान रहें:new NSAttributedString("placeholderstring", new CTStringAttributes() { ForegroundColor = UIColor.Blue.CGColor });
योहन दाहमणि

9

स्विफ्ट संस्करण। शायद यह किसी की मदद करेगा।

class TextField: UITextField {
   override var placeholder: String? {
        didSet {
            let placeholderString = NSAttributedString(string: placeholder!, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
            self.attributedPlaceholder = placeholderString
        }
    }
}

6

श्रेणियाँ एफटीडब्ल्यू। प्रभावी रंग परिवर्तन के लिए जाँच करने के लिए अनुकूलित किया जा सकता है।


#import <UIKit/UIKit.h>

@interface UITextField (OPConvenience)

@property (strong, nonatomic) UIColor* placeholderColor;

@end

#import "UITextField+OPConvenience.h"

@implementation UITextField (OPConvenience)

- (void) setPlaceholderColor: (UIColor*) color {
    if (color) {
        NSMutableAttributedString* attrString = [self.attributedPlaceholder mutableCopy];
        [attrString setAttributes: @{NSForegroundColorAttributeName: color} range: NSMakeRange(0,  attrString.length)];
        self.attributedPlaceholder =  attrString;
    }
}

- (UIColor*) placeholderColor {
    return [self.attributedPlaceholder attribute: NSForegroundColorAttributeName atIndex: 0 effectiveRange: NULL];
}

@end

6

दोनों ऊर्ध्वाधर और क्षैतिज संरेखण के साथ-साथ iOS7 में प्लेसहोल्डर के रंग को संभालने के लिए। drawInRect और drawAtPoint अब वर्तमान संदर्भ फिलरोलर का उपयोग नहीं करते हैं।

https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

Obj सी

@interface CustomPlaceHolderTextColorTextField : UITextField

@end


@implementation CustomPlaceHolderTextColorTextField : UITextField


-(void) drawPlaceholderInRect:(CGRect)rect  {
    if (self.placeholder) {
        // color of placeholder text
        UIColor *placeHolderTextColor = [UIColor redColor];

        CGSize drawSize = [self.placeholder sizeWithAttributes:[NSDictionary dictionaryWithObject:self.font forKey:NSFontAttributeName]];
        CGRect drawRect = rect;

        // verticially align text
        drawRect.origin.y = (rect.size.height - drawSize.height) * 0.5;

        // set alignment
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = self.textAlignment;

        // dictionary of attributes, font, paragraphstyle, and color
        NSDictionary *drawAttributes = @{NSFontAttributeName: self.font,
                                     NSParagraphStyleAttributeName : paragraphStyle,
                                     NSForegroundColorAttributeName : placeHolderTextColor};


        // draw
        [self.placeholder drawInRect:drawRect withAttributes:drawAttributes];
    }
}

@end

इस उत्कृष्ट समाधान के लिए धन्यवाद - जो पाठ को लंबवत रूप से केंद्र बनाता है (कस्टम फोंट के साथ उपयोगी)। केवल एक चीज मैं जोड़ना होगा कि इस समाधान पर वापस गिरने से iOS 6 या इसके ठीक करने के लिए पुराने (आसान पर्याप्त के साथ संगत नहीं है [: रेक्ट withFont: self.font lineBreakMode: self.placeholder drawInRect NSLineBreakByTruncatingTail संरेखण: self.textAlignment];
जीवनोपयोगी

6

iOS 6 और बाद में प्रस्तावों attributedPlaceholderपर UITextField। आईओएस 3.2 और बाद प्रस्तावों setAttributes:range:पर NSMutableAttributedString

आप निम्न कार्य कर सकते हैं:

NSMutableAttributedString *ms = [[NSMutableAttributedString alloc] initWithString:self.yourInput.placeholder];
UIFont *placeholderFont = self.yourInput.font;
NSRange fullRange = NSMakeRange(0, ms.length);
NSDictionary *newProps = @{NSForegroundColorAttributeName:[UIColor yourColor], NSFontAttributeName:placeholderFont};
[ms setAttributes:newProps range:fullRange];
self.yourInput.attributedPlaceholder = ms;

सुनिश्चित नहीं है कि समस्या क्या है, इस कोड को मैंने viewdidLoad में बुलाया है। नया रंग और फ़ॉन्ट आकार redraw के बाद ही दिखाई देता है। इसके साथ किसी और चीज की जरूरत है?
विनायका कारजिगी

यह हल हो गया, मैं प्लेसहोल्डर पाठ के लिए उस फ़ॉन्ट का उपयोग करने से पहले UITextfield के लिए फ़ॉन्ट सेट करना भूल गया। मेरा बुरा
विनायका कारजिगी

6

स्विफ्ट 4.1 के लिए यह समाधान

    textName.attributedPlaceholder = NSAttributedString(string: textName.placeholder!, attributes: [NSAttributedStringKey.foregroundColor : UIColor.red])

4

ओवरराइडिंग drawPlaceholderInRect:सही तरीका होगा, लेकिन यह एपीआई (या प्रलेखन) में एक बग के कारण काम नहीं करता है।

विधि कभी नहीं एक पर बुलाया जाता है UITextField

UITextField पर drawTextInRect भी देखें जिसे कॉल नहीं किया गया है

आप digdog के समाधान का उपयोग कर सकते हैं। जैसा कि मुझे यकीन नहीं है कि अगर पिछले सेब की समीक्षा मिलती है, तो मैंने एक अलग समाधान चुना: अपने स्वयं के लेबल के साथ पाठ क्षेत्र को ओवरले करें जो प्लेसहोल्डर व्यवहार की नकल करता है।

हालांकि यह थोड़ा गड़बड़ है। कोड इस तरह दिखता है (ध्यान दें कि मैं TextField के एक उपवर्ग के अंदर यह कर रहा हूं):

@implementation PlaceholderChangingTextField

- (void) changePlaceholderColor:(UIColor*)color
{    
    // Need to place the overlay placeholder exactly above the original placeholder
    UILabel *overlayPlaceholderLabel = [[[UILabel alloc] initWithFrame:CGRectMake(self.frame.origin.x + 8, self.frame.origin.y + 4, self.frame.size.width - 16, self.frame.size.height - 8)] autorelease];
    overlayPlaceholderLabel.backgroundColor = [UIColor whiteColor];
    overlayPlaceholderLabel.opaque = YES;
    overlayPlaceholderLabel.text = self.placeholder;
    overlayPlaceholderLabel.textColor = color;
    overlayPlaceholderLabel.font = self.font;
    // Need to add it to the superview, as otherwise we cannot overlay the buildin text label.
    [self.superview addSubview:overlayPlaceholderLabel];
    self.placeholder = nil;
}

आप अपने समीक्षा के अनुकूल समाधान साझा करने के बारे में कैसा महसूस करेंगे?
adam

मैंने अपने द्वारा उपयोग किए गए समाधान को जोड़ा। मुझे थोड़ी खुदाई
करनी पड़ी

मैंने ऐसा ही कुछ किया है, लेकिन मैंने कोड को एक श्रेणी में रखा है, और यह देखने के लिए कि क्या इसे बनाना है, जो कि श्रेणी में एक दूसरी विधि थी - (शून्य) ओवरलेप्लसहोल्डरहोल्डर (BOOL) दृश्य में क्या है, इस पर कंवर्टच्रेक्टर्स में एक चेक करने की आवश्यकता है ;
डेविड वैन डुगटरन

3

Iam नया करने के लिए xcode और मैं एक ही प्रभाव के आसपास एक रास्ता मिल गया।

मैंने वांछित प्रारूप वाले स्थान धारक के स्थान पर एक यूलैबेल रखा और इसे अंदर छिपा दिया

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    switch (textField.tag)
    {
        case 0:
            lblUserName.hidden=YES;
            break;

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

मैं इसके चारों ओर एक काम से सहमत हूं और वास्तविक समाधान नहीं है लेकिन इसका प्रभाव इस लिंक से मिला है

नोट: अभी भी iOS 7 पर काम करता है: |


3

5 स्विफ्ट CAVEAT के साथ।

let attributes = [ NSAttributedString.Key.foregroundColor: UIColor.someColor ]
let placeHolderString = NSAttributedString(string: "DON'T_DELETE", attributes: attributes)
txtField.attributedPlaceholder = placeHolderString

यह चेतावनी दी जा रही है कि आप String" गैर DON'T_DELETE" एक गैर-रिक्त स्थान दर्ज करें , भले ही वह स्ट्रिंग कोड में कहीं और सेट की गई हो। हो सकता है कि आप पांच मिनट तक सिर हिलाते रहें।


2

IOS7 और उससे कम दोनों के लिए सबसे अच्छा मैं कर सकता हूं:

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

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

- (CGRect)textRectForBounds:(CGRect)bounds {
  CGRect rect = CGRectInset(bounds, 0, 6); //TODO: can be improved by comparing font size versus bounds.size.height
  return rect;
}

- (void)drawPlaceholderInRect:(CGRect)rect {
  UIColor *color =RGBColor(65, 65, 65);
  if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.placeholder drawInRect:rect withAttributes:@{NSFontAttributeName:self.font, UITextAttributeTextColor:color}];
  } else {
    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font];
  }
}

2

Monotouch (Xamarin.iOS) का उपयोग करने वालों के लिए, यहाँ आदम के उत्तर, C # का अनुवाद किया गया है:

public class MyTextBox : UITextField
{
    public override void DrawPlaceholder(RectangleF rect)
    {
        UIColor.FromWhiteAlpha(0.5f, 1f).SetFill();
        new NSString(this.Placeholder).DrawString(rect, Font);
    }
}

महान। यह वास्तव में स्पष्ट नहीं था, आपने शायद मुझे कुछ समय बचाया :) मैंने आपका समाधान संपादित किया, हालांकि मुझे लगता Fontहै कि पाठ क्षेत्र की संपत्ति में फ़ॉन्ट सेट का उपयोग करना बेहतर विचार है ।
वोल्फगैंग श्रेयर्स

1

मुझे प्लेसहोल्डर संरेखण रखने की आवश्यकता थी, इसलिए मेरे लिए एडम का जवाब पर्याप्त नहीं था।

इसे हल करने के लिए मैंने एक छोटे से बदलाव का इस्तेमाल किया है, जो मुझे आशा है कि आप में से कुछ को भी मदद करेगा:

- (void) drawPlaceholderInRect:(CGRect)rect {
    //search field placeholder color
    UIColor* color = [UIColor whiteColor];

    [color setFill];
    [self.placeholder drawInRect:rect withFont:self.font lineBreakMode:UILineBreakModeTailTruncation alignment:self.textAlignment];
}

UILineBreakModeTailTruncationआईओएस 6 के रूप में पदावनत किया गया है
सुपर्टेकोनॉफ

1
[txt_field setValue:ColorFromHEX(@"#525252") forKeyPath:@"_placeholderLabel.textColor"];

इस पर एक छोटा संकेत यह है कि आप एक निजी iVar (_placeholderLabel) का उपयोग कर रहे हैं और अतीत में Apple ऐसा करने के बारे में थोड़ा दुविधा में रहा है। :)
अलेक्जेंडर डब्ल्यू

1

एकाधिक रंग के साथ सेट किए गए टेक्स्टफील्ड प्लेसहोल्डर के लिए,

बस पाठ निर्दिष्ट करें,

  //txtServiceText is your Textfield
 _txtServiceText.placeholder=@"Badal/ Shah";
    NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:_txtServiceText.placeholder];
     [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor whiteColor] range:[_txtServiceText.placeholder rangeOfString:@"Badal/"]]; //Replace it with your first color Text
    [mutable addAttribute: NSForegroundColorAttributeName value:[UIColor orangeColor] range:[_txtServiceText.placeholder rangeOfString:@"Shah"]]; // Replace it with your secondcolor string.
    _txtServiceText.attributedPlaceholder=mutable;

आउटपुट: -

यहाँ छवि विवरण दर्ज करें


0

एक अन्य विकल्प जिसमें उप-वर्ग की आवश्यकता नहीं होती है - प्लेसहोल्डर को खाली छोड़ दें, और संपादन बटन के ऊपर एक लेबल लगाएं। जैसे आप प्लेसहोल्डर का प्रबंधन करेंगे वैसे ही लेबल को प्रबंधित करें (उपयोगकर्ता इनपुट के बाद किसी भी चीज़ को साफ़ करते हुए ..)


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