我有UITextField,文本较长,设置为占位符。我想要的是这个占位符文本在字段宽度太小时调整其字体大小。
我已经尝试过其他帖子(编程和IB)中描述的解决方案
self.fieldTest.adjustsFontSizeToFitWidth = true
self.fieldTest.minimumFontSize = 10.0
我在这里缺少什么?
答案 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)
答案 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。