UITextField占位符文本:adjust to fit

时间:2015-11-19 13:55:29

标签: ios swift uitextfield

我有UITextField,文本较长,设置为占位符。我想要的是这个占位符文本在字段宽度太小时调整其字体大小。

我已经尝试过其他帖子(编程和IB)中描述的解决方案

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

我在这里缺少什么?

12 个答案:

答案 0 :(得分:30)

您可以创建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
        }
    }
}

答案 1 :(得分:14)

你走了:

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

干杯!!

答案 2 :(得分:5)

基于答案9:在Storyboard中,转到文本字段元素的身份检查器选项卡,并在"用户定义的运行时属性"部分,添加以下内容:

enter image description here

答案 3 :(得分:2)

在查看UITextField的类引用之后,adjustsFontSizeToFitWidth似乎只影响UITextField的text属性而不影响占位符属性。虽然我不知道如何让占位符响应adjustsFontSizeToFitWidth,但我可以提出两个可能会给你你想要的外观的hacky想法。请注意,我现在不在Mac附近,所以我还没有测试过这些想法:

1:
由于占位符只是具有70%灰色的文本,因此您可以将标签的文本属性设置为您需要的任何内容,然后实现UITextFieldDelegate的textFieldShouldBeginEditing方法以清除文本并更改颜色恢复正常。您还必须实现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。

答案 4 :(得分:2)

这是一个解决方案,取决于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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

<强>夫特

随意改进扩展 - 非常确定有一种更优雅的方式来迭代子视图。

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

答案 7 :(得分:0)

尝试使用属性占位符代替普通占位符

试试这个

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

您可以向占位符添加其他属性,例如textcolor和其他

答案 8 :(得分:0)

在Swift中

{{1}}

它有效:)

答案 9 :(得分:0)

我的解决方案:

if let label = yourTextField.value(forKey: "placeholderLabel") as? UILabel {
   label.adjustsFontSizeToFitWidth = true
}

别忘了这个:

yourTextField.minimumFontSize = 10 // 10 is an example, pass your minimumFontSize

经过测试并完美运行。

答案 10 :(得分:0)

试试这个:它工作正常,没有任何问题:

yourTextField.placeholder = "Adjust placeHolder text for textFields iOS"
let label = yourTextField.value(forKey: "_placeholderLabel") as? UILabel
label?.adjustsFontSizeToFitWidth = true

答案 11 :(得分:-2)

在可访问性的日期和年龄,整个方法或缩小的字体大小都是错误的。

首先,您首先没有指定文本大小的业务,更不用说进一步缩小:您必须依赖可访问性API。

因此,如果占位符可能不适合,则必须放置它 作为UITextField之前的UILabel。占位符应该是简洁的,没有任何碎片。

确定它是否被剪裁我想你可以使用 - (CGRect)placeholderRectForBounds:(CGRect)bounds;但是你在 使用API​​的模糊水域Apple认为你应该只能覆盖(但不要称自己,即使它可能是有意义和安全的 在didlayoutsubviews方法的范围内[s])

如果占位符文本是动态的(服务器服务器),请将其转储到UILabel。