我该如何设置UITextView中文本的字体大小,使其填充整个UITextView?我希望用户输入他们的文本,然后让文本填充整个UITextView。调整字体大小以填充UITextView?
任何帮助表示赞赏!
我该如何设置UITextView中文本的字体大小,使其填充整个UITextView?我希望用户输入他们的文本,然后让文本填充整个UITextView。调整字体大小以填充UITextView?
任何帮助表示赞赏!
此属性仅适用于UITextFields。要在UITextView中执行此操作,您必须不断观看文本并手动调整已更改的字体大小。
这在UITextView的类别中应该有效。对于为什么需要fudgefactor,看到this post
#define kMaxFieldHeight 9999
-(BOOL)sizeFontToFit:(NSString*)aString minSize:(float)aMinFontSize maxSize:(float)aMaxFontSize
{
float fudgeFactor = 16.0;
float fontSize = aMaxFontSize;
self.font = [self.font fontWithSize:fontSize];
CGSize tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
while (stringSize.height >= self.frame.size.height)
{
if (fontSize <= aMinFontSize) // it just won't fit
return NO;
fontSize -= 1.0;
self.font = [self.font fontWithSize:fontSize];
tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
}
return YES;
}
在iOS> 7.0中,您需要将UILineBreakModeWordWrap更改为NSLineBreakByWordWrapping – ignotusverum
只是好奇,您怎么知道“fudgeFactor = 16.0”?当文字大小较小时,我认为此值应该较小 – Jacky
类似的方法来阿里Litovsky的答案,但没有子类(或使用类)和不使用contentSize
,它没有为我返回正确的渲染文本高度。在iOS 7上测试:
while (((CGSize) [_textView sizeThatFits:_textView.frame.size]).height > _textView.frame.size.height) {
_textView.font = [_textView.font fontWithSize:_textView.font.pointSize-1];
}
该方法是继续缩小字体大小,直到文本恰好适合文本视图的框架。
如果您打算在生产中使用这个,你仍然需要:
处理“增加”字体大小写的快速方法:http://pastie.org/8975356 – Anil
这是我的示例代码。基本上,我检查期望的大小,知道字体大小是否需要增加或减少。您需要UITextViewDelegate添加到您的类以确保其运作
- (void)updateTextFont:(UITextView *)textView
{
// Only run if has text, otherwise it will make infinity loop
if (textView.text.length == 0 || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) return;
/*
- Update textView font size
If expectHeight > textViewHeight => descrease font size n point until it reach textViewHeight
If expectHeight < textViewHeight => inscrease font size n point until it reach textViewHeight
*/
CGSize textViewSize = textView.frame.size;
CGFloat fixedWidth = textViewSize.width;
CGSize expectSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
UIFont *expectFont = textView.font;
if (expectSize.height > textViewSize.height) {
while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height > textViewSize.height) {
expectFont = [textView.font fontWithSize:(textView.font.pointSize-1)];
textView.font = expectFont;
}
} else {
while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height < textViewSize.height) {
expectFont = textView.font;
textView.font = [textView.font fontWithSize:(textView.font.pointSize+1)];
}
textView.font = expectFont;
}
}
我很好奇else子句在这里做什么。在修改之前,你在'textView's'' font'中设置了'expectFont' ...然后你将它设置回未修改的'font'?那是为了防止文字大小的跳跃和跳跃? –
@StephenPaul in else子句,如果while不运行,'textView.font'不会改变(因为'expectFont'实际上是原始的'textView.font')。但是,如果至少运行一次,'expectFont'会更改,我们需要在完成循环后更新它。我可以在运行或不运行时确定一个标志,但我没有。相反,我把它分成最后一行'textView。font = expectFont' – nahung89
如果while循环运行至少1次,则将当前字体存储在变量'expectFont'中。然后你增加'textView'的字体一点,但是当那个while循环退出时,你会看到'textView'字体回到了原来的样子...... –
我已经转换dementiazz's answer斯威夫特:
func updateTextFont() {
if (textView.text.isEmpty || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) {
return;
}
let textViewSize = textView.frame.size;
let fixedWidth = textViewSize.width;
let expectSize = textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT)));
var expectFont = textView.font;
if (expectSize.height > textViewSize.height) {
while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height > textViewSize.height) {
expectFont = textView.font!.fontWithSize(textView.font!.pointSize - 1)
textView.font = expectFont
}
}
else {
while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height < textViewSize.height) {
expectFont = textView.font;
textView.font = textView.font!.fontWithSize(textView.font!.pointSize + 1)
}
textView.font = expectFont;
}
}
的@Arie Litovsky的代码的更新版本。这适用于iOS7及更高版本,并且可以向上和向下延伸字体大小以适应文本。
- (void) stretchFontToFit:(UITextView*)textView
{
while(textView.contentSize.height < textView.frame.size.height)
{
textView.font = [textView.font fontWithSize:textView.font.pointSize +1];
[textView layoutIfNeeded];
}
while(textView.contentSize.height > textView.frame.size.height)
{
textView.font = [textView.font fontWithSize:textView.font.pointSize -1];
[textView layoutIfNeeded];
}
}
在viewDidLoad中:
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0);
您需要添加UITextViewDelegate:
- (void)updateTextFont:(UITextView *)textView {
CGSize textViewSize = textView.frame.size;
CGSize sizeOfText = [textView.text sizeWithAttributes:@{NSFontAttributeName: textView.font}];
CGFloat fontOfWidth = floorf(textView.font.pointSize/sizeOfText.height * textViewSize.height);
CGFloat fontOfHeight = floorf(textView.font.pointSize/sizeOfText.width * textViewSize.width);
textView.font = [textView.font fontWithSize:MIN(fontOfHeight, fontOfWidth)];
}
我已经转换dementiazz的&马特Frear的回答让斯威夫特3:
func updateTextFont() {
if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) {
return
}
let textViewSize = textView.frame.size
let fixedWidth = textViewSize.width
let expectSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)))
var expectFont = textView.font
if (expectSize.height > textViewSize.height) {
while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height > textViewSize.height) {
expectFont = textView.font!.withSize(textView.font!.pointSize - 1)
textView.font = expectFont
}
}
else {
while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height < textViewSize.height) {
expectFont = textView.font
textView.font = textView.font!.withSize(textView.font!.pointSize + 1)
}
textView.font = expectFont
}
}
适合我。谢谢! –
ü能够!self.textview.font .fontName,
大小:self.textview.frame使用
self.textview.font
=self.textview.font = UIFont(名字很容易做到这一点。 size.height/10)!在根据您的需要某个常数
鸿沟textview.frame.size.height ..
为SWIFT 3
func updateTextFont(textView : UITextView) {
if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) {
return;
}
let textViewSize = textView.frame.size;
let fixedWidth = textViewSize.width;
let expectSize = textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT)));
var expectFont = textView.font;
if (expectSize.height > textViewSize.height) {
while (textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT))).height > textViewSize.height) {
expectFont = textView.font!.withSize(textView.font!.pointSize - 1)
textView.font = expectFont
}
}
else {
while (textView.sizeThatFits(CGSize(width : fixedWidth,height : CGFloat(MAXFLOAT))).height < textViewSize.height) {
expectFont = textView.font;
textView.font = textView.font!.withSize(textView.font!.pointSize + 1)
}
textView.font = expectFont;
}
}
这里是解决斯威夫特4(基于Arie Litovsky答案),您可以将此代码放入textViewDidChange(_ textView: UITextView)
代表方法:
缩小字体:
while (textView.contentSize.height > textView.frame.size.height) {
guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return}
if fontSize < 12 {
return
}
textView.font = UIFont(name: fontName, size: fontSize - 1)
textView.layoutIfNeeded()
}
和扩大字体:
while (textView.contentSize.height < textView.frame.size.height) {
guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return}
if fontSize > 15 {
return
}
textView.font = UIFont(name: fontName, size: fontSize + 1)
textView.layoutIfNeeded()
}
可以更改fontSize < 12
和fontSize > 15
以适应最小和最大字体大小您的需求。
啊,是否有任何示例代码在那里呢?我环顾四周,找不到任何东西。非常感谢! –
我不知道任何示例代码;我从来没有听说过有人试图这样做。 –