598 Stimmen

iPhone UITextField - Farbe des Platzhaltertextes ändern

Ich würde gerne die Farbe des Platzhaltertextes ändern, den ich in meinem UITextField Kontrollen, um es schwarz zu machen.

Ich würde es vorziehen, dies zu tun, ohne normalen Text als Platzhalter zu verwenden und alle Methoden überschreiben zu müssen, um das Verhalten eines Platzhalters zu imitieren.

Ich glaube, wenn ich diese Methode außer Kraft setze:

- (void)drawPlaceholderInRect:(CGRect)rect

dann sollte ich in der Lage sein, dies zu tun. Aber ich bin unsicher, wie man das tatsächliche Platzhalter-Objekt aus dieser Methode zugreifen.

7voto

aumansoftware Punkte 835

Um sowohl die vertikale und horizontale Ausrichtung als auch die Farbe des Platzhalters in iOS7 zu behandeln. drawInRect und drawAtPoint verwenden nicht mehr die aktuelle Kontextfarbe fillColor.

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

Obj-C

@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

6voto

osxdirk Punkte 560

Kategorien FTW. Könnte optimiert werden, um eine effektive Farbänderung zu überprüfen.


#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

4voto

henning77 Punkte 3804

Übergeordnetes Recht drawPlaceholderInRect: wäre der richtige Weg, aber aufgrund eines Fehlers in der API (oder der Dokumentation) funktioniert er nicht.

Die Methode wird nie bei einer UITextField .

Siehe auch drawTextInRect auf UITextField nicht aufgerufen

Sie könnten die Lösung von digdog verwenden. Da ich nicht sicher bin, ob das Apples Überprüfung übersteht, habe ich eine andere Lösung gewählt: Ich überlagere das Textfeld mit einer eigenen Beschriftung, die das Verhalten des Platzhalters nachahmt.

Das ist allerdings ein bisschen chaotisch. Der Code sieht wie folgt aus (Hinweis: Ich tue dies innerhalb einer Unterklasse von 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;
}

3voto

amar Punkte 4237

Ich bin neu in Xcode und ich fand einen Weg, um den gleichen Effekt.

Ich habe ein uilabel anstelle des Platzhalters mit dem gewünschten Format platziert und es in

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

        case 1:
            lblPassword.hidden=YES;
            break;

        default:
            break;
    }
}

Ich stimme zu, dass es ein Workaround ist und keine wirkliche Lösung, aber der Effekt war derselbe, den ich von diesem enlace

HINWEIS: Funktioniert immer noch unter iOS 7 :|

2voto

Aleksei Minaev Punkte 1379

Das Beste, was ich sowohl für iOS7 als auch für weniger tun kann, ist:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X