it-swarm.com.ru

Текст заполнителя UITextField: подгонка под размер

У меня UITextField с более длинным текстом, установленным в качестве заполнителя. Я хочу, чтобы этот текст-заполнитель регулировал размер шрифта, когда ширина поля слишком мала. 

Я уже пробовал это решение, описанное в других постах (программно и в IB)

self.fieldTest.adjustsFontSizeToFitWidth = true
self.fieldTest.minimumFontSize = 10.0

Что мне здесь не хватает?

16
spafrou

Вы можете создать подкласс UITextField:

class AutoSizeTextField: UITextField {
    override func layoutSubviews() {
        super.layoutSubviews()

        for subview in subviews {
            if let label = subview as? UILabel {
                label.minimumScaleFactor = 0.3
                label.adjustsFontSizeToFitWidth = true
            }
        }
    }
}    

Или вы можете просто добавить код в viewDidAppear вашего контроллера представления:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    for subview in fieldTest.subviews {
        if let label = subview as? UILabel {
            label.minimumScaleFactor = 0.3
            label.adjustsFontSizeToFitWidth = true
        }
    }
}
25
wj2061

Ну вот :

_myTextField.placeholder = @"SomeTextSomeTextSome";
UILabel *label = [_myTextField valueForKey:@"_placeholderLabel"];
label.adjustsFontSizeToFitWidth = YES;

Ура !!

13
sashi_bhushan

На основании ответа 9: в раскадровке перейдите на вкладку инспектора идентификации элемента текстового поля и в разделе «Определенные пользователем атрибуты времени выполнения» добавьте следующее:

 enter image description here

5
Arik Segal

Вот решение, которое зависит от недокументированного факта, что у UITextField есть дочерний элемент UILabel (фактически UITextFieldLabel) для отображения заполнителя. Преимущество этого решения перед некоторыми другими заключается в том, что оно изящно ухудшается в случае изменения реализации Apple. Это также не делает предположений о существовании недокументированных иваров. 

В основном мы расширяем UILabel через категорию. Если мы видим, что нас связывают с UITextField, тогда мы включаем adjustFontSizeToFitWidth.

@interface UILabel (TS)
@end

@implementation UILabel (TS)

- (void) didMoveToSuperview
{
    [super didMoveToSuperview];

    if ( [self.superview isKindOfClass: [UITextField class]] ) {

        self.adjustsFontSizeToFitWidth = YES;
    }
}

@end
2
TomSwift

Изучив ссылку на класс для UITextField, кажется, что AdjustmentsFontSizeToFitWidth влияет только на текстовое свойство UITextField, а не на свойство заполнителя. Несмотря на то, что я не знаю, каким образом можно заставить заполнитель реагировать на AdjusttsFontSizeToFitWidth, я могу предложить две хакерские идеи, которые могут дать вам тот вид, который вам нужен. Просто знайте, что я сейчас не рядом с Mac, поэтому я не проверял эти идеи: 

1:
Поскольку местозаполнителем является просто текст с 70% серого цвета, вы можете установить для свойства текста метки то, что вам нужно, а затем реализовать метод textFieldShouldBeginEditing в UITextFieldDelegate, чтобы очистить текст и изменить цвет на нормальный. , Вы также должны будете реализовать методы textFieldShouldClear и textFieldDidEndEditing, чтобы заменить псевдо-заполнитель обратно в UITextField и изменить цвет текста обратно на 70% серый. 

2:
В viewWillAppear вы можете установить для текста UITextField то, что должно быть вашим заполнителем, создать объект UIFont и установить его равным свойству шрифта UITextField, очистить текст UITextField и установить в качестве заполнителя NSAttributedString с объектом шрифта как недвижимость. Вот пример того, что я имею в виду: 

-(void)viewWillAppear:(BOOL) animated {
    [super viewWillAppear:animated];
    someTextField.adjustsFontSizeToFitWidth = YES;
    someTextField.text = @"placeholderText";
    UIFont *font = someTextField.font;
    someTextField.text = nil;
    NSDictionary * attributes = [NSDictionary dictionaryWithObject:color forKey:NSFontAttributeName];
    NSAttributedString *placeholderString= [[NSAttributedString alloc] initWithString:@"placeholderText" attributes:attributes];
    someTextField.placeholder = palceholderString;
}  

Правка: только что заметил тег Swift. Я написал свой код в Objective-C, но вы сможете легко перевести его на Swift.

2
tww0003
 override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
       for subView in fieldTest.subviews{
        if subView .isKind(of: UILabel.self){
            let label = subView as! UILabel
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.2
        }
    }     
}
1
KSR

Свифт

Не стесняйтесь улучшать расширение - уверен, что есть более элегантный способ перебора подпредставлений.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    tfCountryCode.allSubviewsOfClass(UILabel.self).forEach {
        $0.adjustsFontSizeToFitWidth = true
        $0.minimumScaleFactor = 0.5
    }
}

extension UIView {
    func allSubviewsOfClass<K: UIView>(_ clazz: K.Type) -> [K] {
        var matches = [K]()
        if subviews.isEmpty { return matches }
        matches.append(contentsOf: subviews.filter { $0 is K } as! [K])
        let matchesInSubviews = subviews.flatMap { return $0.allSubviewsOfClass(clazz) }
        matches.append(contentsOf: matchesInSubviews.flatMap { $0 })
        return matches
    }
}
1
Alexandre G

Попробуйте использовать атрибутивный заполнитель вместо обычного

Попробуй это

let attributedplaceholder = NSAttributedString(string: "placeholdertext", attributes: [NSFontAttributeName: UIFont(name: "FontName", size: 10)!])
self.fieldTest.attributedPlaceholder = attributedplaceholder

Вы можете добавить дополнительные атрибуты для заполнителя, такие как textcolor и другие

0
Mohammed Janish

В Свифте

yourTextField.subviews
        .filter { $0 is UILabel }
        .flatMap { $0 as? UILabel }
        .forEach {
            $0.adjustsFontSizeToFitWidth = true
            $0.minimumScaleFactor = 0.5
        }

оно работает :)

0
Cruz

Вы можете использовать эти два решения:

1. Если у вас установлен фиксированный размер шрифта, если размер текстового поля меньше, чем текст заполнителя:

    let placeholderString = testTF.placeholder

    print(placeholderString!)

    let font = UIFont(name: (testTF.font?.fontName)!, size: 16)!

    let fontAttributes = [NSFontAttributeName: font]

    let size = (placeholderString! as NSString).sizeWithAttributes(fontAttributes)

    print(size)
    print(testTF.frame.size.width)
    if(size.width > testTF.frame.size.width)
    {
        let font = UIFont(name: (testTF.font?.fontName)!, size: 4)!
        let attributes = [
            NSForegroundColorAttributeName: UIColor.lightGrayColor(),
            NSFontAttributeName : font]

        testTF.attributedPlaceholder = NSAttributedString(string: placeholderString!,
                                                          attributes:attributes)


    }
    else
    {
    let attributes = [
        NSForegroundColorAttributeName: UIColor.lightGrayColor(),
        NSFontAttributeName : font]

    testTF.attributedPlaceholder = NSAttributedString(string: placeholderString!,
                                                         attributes:attributes)
    }

2) Если вы хотите динамический размер шрифта, чем просто проверить вышеупомянутое условие для ширины текстового поля и заполнителя text size.width. если размер текста заполнителя больше, чем размер текстового поля, создайте одну метку внутри текстового поля и установите для нее минимальный шрифт.

if (size.width> testTF.frame.size.width) {

        placeholder = UILabel(frame: CGRect( x: 0, y: 0, width: testTF.bounds.width, height: testTF.bounds.height))
        placeholder.text = placeholderString
        placeholder.numberOfLines = 1;
        //placeholder.minimumScaleFactor = 8;
        placeholder.adjustsFontSizeToFitWidth = true
        placeholder.textColor = UIColor.grayColor()
        placeholder.hidden = !testTF.text!.isEmpty
        placeholder.textAlignment = .Center
        testTF.addSubview(placeholder)

}

0
Sagar Snehi