Подтвердить что ты не робот

Изменение шрифта шрифта UITextField

Я меняю цвет текста заполнителя следующим кодом, но когда я пытаюсь добавить NSFontAttribute, я получаю ошибку компилятора "too many arguments to method call, expect 2 have 3"

 UIColor *color = [UIColor blackColor];
        _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color},@{NSFontAttributeName:@"Roboto-Bold"}]; 

Это работает отлично:

 UIColor *color = [UIColor blackColor];
        _nameField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Your Name" attributes:@{NSForegroundColorAttributeName: color}]; 
4b9b3361

Ответ 1

Objective-C:

UIColor *color = [UIColor blackColor];    
someUITextField.attributedPlaceholder =
  [[NSAttributedString alloc] initWithString:@"Placeholder Text"
    attributes:@{
       NSForegroundColorAttributeName: color,
       NSFontAttributeName : [UIFont fontWithName:@"Roboto-Bold" size:17.0]
    }
  ];

(Не существует скобок между буквальными dictionary парами ключ-значение.)

Swift:

let attributes = [
    NSForegroundColorAttributeName: UIColor.blackColor(),
    NSFontAttributeName : UIFont(name: "Roboto-Bold", size: 17)! // Note the !
]

someUITextField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes:attributes)

Ответ 2

Для удобства быстрых людей:

someTextField.attributedPlaceholder = NSAttributedString(string: "someString", 
attributes:[NSForegroundColorAttributeName: UIColor.lightGrayColor(), NSFontAttributeName: PlaceHolderFont])

Ответ 3

для Swift пользователей:

let font = UIFont(name: "Avenir", size: 16)!
let attributes = [
        NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
        NSFontAttributeName : font]

textField.attributedPlaceholder = NSAttributedString(string: "Type something",
        attributes:attributes)

Убедитесь, что вы правильно пишете имя шрифта.

Ответ 4

Вы должны подклассифицировать UITextField и переопределить метод:

- (void)drawPlaceholderInRect:(CGRect)rect;

Ниже приведена реализация:

- (void)drawPlaceholderInRect:(CGRect)rect {
     NSDictionary *attributes = @{
                             NSForegroundColorAttributeName : [UIColor lightGrayColor],
                             NSFontAttributeName : [UIFont italicSystemFontOfSize:self.font.pointSize]
                             };
    // center vertically
    CGSize textSize = [self.placeholder sizeWithAttributes:attributes];
    CGFloat hdif = rect.size.height - textSize.height;
    hdif = MAX(0, hdif);
    rect.origin.y += ceil(hdif/2.0);
    [[self placeholder] drawInRect:rect withAttributes:attributes];
}

Более подробную информацию вы можете найти нажмите здесь

Ответ 5

Оцените ответ @ddevaz.

Решение подкласса UITextField

Над ответом работает отлично для UITextField. Но когда я использую подкласс UITextField и пытаюсь выполнить этот метод в нем. Тогда он не работает.

Я нашел другое решение только при подклассе UITextField. Переопределите ниже метод в подклассе UITextField, и он выполнит работу для вас.

- (void) drawPlaceholderInRect:(CGRect)rect {
    NSDictionary *attrDictionary = @{
                                     NSForegroundColorAttributeName: [UIColor lightGrayColor],
                                     NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:17.0]
                                     };

    [[self placeholder] drawInRect:rect withAttributes:attrDictionary];
}

Ответ 6

Если вы хотите поддерживать как iOS 6, так и предыдущие версии, выполните следующие действия:

UIColor *placeholderColor = [UIColor lightTextColor];
UIFont *placeholderFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];

if ([textField respondsToSelector:@selector(attributedPlaceholder)]) {
#ifdef __IPHONE_6_0
    textField.attributedPlaceholder = [[NSAttributedString alloc]
        initWithString:textField.placeholder attributes: // NOTE: textField.placeholder can't be nil
              @{ NSForegroundColorAttributeName : placeholderColor,
                 NSFontAttributeName : placeholderFont }];
#endif
} else { // for pre-iOS6
    [textField setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
    [textField setValue:placeholderFont forKeyPath:@"_placeholderLabel.font"];
}

Ответ 7

Обновление для Swift 4

let attributes = [
    NSAttributedStringKey.foregroundColor: .black,
    NSAttributedStringKey.font : UIFont(name: "Your font name", size: 14)!
]

someTextfield.attributedPlaceholder = NSAttributedString(string: "Placeholder text", attributes:attributes)

Ответ 8

Вы можете использовать код ниже  Сначала найдите имя принятого в системе шрифта для вашего пользовательского шрифта

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
        NSLog(@"%@", fontName);
    }
}

а затем используйте нижеприведенный код, сделайте свой заполнитель с пользовательским шрифтом

searchTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Where are you shopping?" attributes:@{NSFontAttributeName : font }];

В противном случае может возникнуть возможность получить объект nil [1] для шрифта, который не найден

Ответ 9

    let attributes: [NSAttributedStringKey : Any] = [NSAttributedStringKey.foregroundColor: UIColor.black,
 NSAttributedStringKey.font: UIFont(name: "Menlo", size: 17.0) ?? UIFont.systemFont(ofSize: 17.0) ]


    textField.attributedPlaceholder = NSAttributedString(string: "Placeholder Text", attributes: attributes)

Примечание: когда мы используем метод UIFont (имя: "Menlo", size: 17.0), если имя шрифта не может получить его в ios, значит, оно будет нулевым, поэтому нам нужно предоставить шрифт по умолчанию. Это было объяснено выше.

Вы можете использовать нижеследующий код. Сначала найдите имя принятого в системе шрифта для вашего пользовательского шрифта.

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
    NSLog(@"%@", fontName);
   }
 }