2010-01-10 23 views

Odpowiedz

2

Ta właściwość jest dostępna tylko w UITextFields. Aby to zrobić w UITextView, musisz stale obserwować tekst i ręcznie dostosowywać rozmiar czcionki, który się zmienił.

+0

Ah, czy istnieje jakiś przykładowy kod, który to robi? Rozejrzałem się i nie mogłem nic znaleźć. Dzięki wielkie! –

+0

Nie znam żadnego przykładowego kodu; Nigdy wcześniej nie słyszałem, żeby ktoś próbował to zrobić. –

8

To, w kategorii na UITextView, powinno załatwić sprawę. Dlaczego trzeba się fudgefactor patrz 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; 
} 
+2

w iOS> 7.0 musisz zmienić UILineBreakModeWordWrap na NSLineBreakByWordWrapping – ignotusverum

+0

po prostu ciekawy, skąd znasz "fudgeFactor = 16.0"? Wierzę, że ta wartość powinna być mniejsza, gdy rozmiar tekstu jest mniejszy. – Jacky

5

Spróbuj tego, że jest to dużo prostsze:

while (self.contentSize.height > self.frame.size.height) 
{ 
    self.font = [self.font fontWithSize:self.font.pointSize -1]; 
} 
+0

+1, działa dobrze – NAZIK

+3

Nie działa w iOS7. –

+2

@BradMoore, musisz dodać jeszcze jedną linię: [textView layoutSubviews]; – Jacky

6

podobne podejście do odpowiedzi Arie Litovsky, ale bez sub-pogrupowanie (lub wykorzystania kategorii) oraz nie używać contentSize, która nie zwróciła mi poprawnej wysokości renderowanego tekstu. Testowane na iOS 7:

while (((CGSize) [_textView sizeThatFits:_textView.frame.size]).height > _textView.frame.size.height) { 
    _textView.font = [_textView.font fontWithSize:_textView.font.pointSize-1]; 
} 

Podejście jest utrzymanie zmniejszenie rozmiaru czcionki, aż tekst po prostu pasuje wewnątrz ramki widoku tekstowym.

Jeśli zamierzali skorzystać z tej produkcji będzie trzeba jeszcze:

  • Uchwyt przypadek, w którym nawet najmniejszy możliwy rozmiar czcionki, tekst nadal nie będzie pasował.
  • Użyj podobnego rozwiązania, aby zwiększyć rozmiar czcionki, jeśli chcesz również przeskalować tekst do rozmiaru w celu dopasowania do ramki.
+0

Szybkie podejście do obsługi problemu z czcionką "Increase": http://pastie.org/8975356 – Anil

2

Oto mój przykładowy kod. Zasadniczo sprawdzam rozmiar oczekiwany, aby wiedzieć, czy rozmiar czcionki musi się zwiększyć lub zmniejszyć. Trzeba dodać UITextViewDelegate do swojej klasy, aby upewnić się, że funkcjonowanie it

- (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; 
    } 
} 
+0

Ciekawi mnie, co tutaj robi klauzula else. Ustawiasz 'expectFont' na' 'textView'' font' przed modyfikacją ... a następnie ustawiasz z powrotem na niezmodyfikowaną' font'? Czy to zapobiega przeskakiwaniu w górę iw dół rozmiaru tekstu? –

+0

@StephenPaul in else klauzula, jeśli nie działa, 'tekstView.font' nie zmienia się (ponieważ' expectFont' jest faktycznie oryginalnym 'textView.font'). Ale jeśli uruchomimy co najmniej 1 raz, 'expectFont' zostanie zmieniony i musimy go zaktualizować po zakończeniu pętli. Mógłbym zrobić flagę, by ustalić, czy biegnę, czy nie, ale ja nie. Zamiast tego zgrupuję go w ostatniej linii 'textView.font = expectFont' – nahung89

+0

jeśli pętla while działa co najmniej 1 raz, to przechowujesz bieżącą czcionkę w zmiennej 'expectFont'. Następnie zwiększasz czcionkę 'textView' o jeden punkt, ale gdy ta pętla zostanie zamknięta, zobaczysz, że czcionka' textView' z powrotem do tego, co było ... –

10

Mam przeliczone dementiazz's answer do SWIFT:

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; 
    } 
} 
+0

Możesz także dodać minimalny i maksymalny rozmiar czcionki, aby uniknąć nieoczekiwanych rozmiarów. (zbyt duży lub zbyt mały) Właśnie dodałem warunek "&& (textView.font! .pointSize> CGFloat (minSize))" do twojego czasu – RubenVot

+0

@RubenVot, kiedy powinniśmy użyć tej funkcji? – Shyam

0

An zaktualizowaną wersję kodu @Arie Litovsky użytkownika. Działa to w systemie iOS7 i późniejszym oraz rozciąga rozmiar czcionki zarówno w górę, jak iw dół, dzięki czemu tekst pasuje.

- (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]; 
    } 
} 
0

W viewDidLoad:

textView.textContainer.lineFragmentPadding = 0; 
textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0); 

Trzeba dodać 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)]; 
} 
1

mam przekształcone odpowiedź dementiazz za & Matt Frear do Swift 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 
    } 
} 
+0

Działa dla mnie. Dzięki! –

-1

U mogą łatwo to zrobić za pomocą

  • self.textview.font =

self.textview.font = UIFont (name: .fontName self.textview.font,
rozmiarze! self.textview.frame. size.height/10)!

podzielić textview.frame.size.height przy pewnej stałej zależności od potrzeb ..

1

do szybkiego 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; 
    } 
} 
-2

Oto rozwiązanie Swift 4 (na Arie Litovsky odpowiedź), możesz umieścić ten kod w: textViewDidChange(_ textView: UITextView) metoda delegata:

Skalowanie czcionki:

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

i zwiększenia czcionki:

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

Można zmienić fontSize < 12 i fontSize > 15 do swoich potrzeb w minimalnej i maksymalnej wielkości czcionki.

Powiązane problemy