Jak dopasować UITextView do jego zawartości?

Czy jest dobry sposób na dostosowanie rozmiaru UITextView do jego zawartości? Na przykład mam UITextView, który zawiera jedną linijkę tekstu:

"Hello world"

Dodaję kolejną linijkę tekstu:

"Goodbye world"

Czy jest dobry sposób w Cocoa Touch, aby uzyskać rect, który będzie trzymał wszystkie linie w widoku tekstowym, aby móc odpowiednio dostosować widok nadrzędny?

Jako kolejny przykład spójrz na pole notatek dla wydarzeń w aplikacji Kalendarz-zwróć uwagę, jak komórka (i UITextView zawiera) rozszerza się, aby utrzymać wszystkie linie tekstu w ciągu notatek.

Author: Alok, 2008-09-08

30 answers

To działa zarówno na iOS 6.1, jak i iOS 7:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}
W systemie operacyjnym Windows jest to system operacyjny Windows.]}
let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

Jeśli chcesz mieć wsparcie dla iOS 6.1, powinieneś również:

textview.scrollEnabled = NO;
 542
Author: jhibberd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 23:46:14

To już nie działa na iOS 7 lub nowszym]}

Istnieje bardzo łatwy sposób na zmianę rozmiaru UITextView do właściwej wysokości zawartości. Można to zrobić za pomocą UITextView contentSize.

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

Należy zauważyć, że poprawny contentSize jest dostępny tylko po UITextView został dodany do widoku za pomocą addSubview. Przed tym jest równa frame.size

To nie zadziała, jeśli układ automatyczny jest włączony. W przypadku układu automatycznego, ogólne podejście polega na użyciu sizeThatFits method and update the constant value on a height constraint.

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint jest ograniczeniem układu, które zazwyczaj konfiguruje się za pomocą IBOutlet, łącząc właściwość z ograniczeniem wysokości utworzonym w storyboardzie.


Aby dodać do tej niesamowitej odpowiedzi, 2014, jeśli:

[self.textView sizeToFit];

Istnieje różnica w zachowaniu z iPhone6+ tylko:

Tutaj wpisz opis obrazka

Z 6 + tylko (nie 5s lub 6) dodaje "jeszcze jedną pustą linię" do UITextView. "Rozwiązanie RL" rozwiązuje to doskonale:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

Rozwiązuje problem "extra line" na 6+.

 570
Author: Ronnie Liew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 10:37:59

W Xcode 6 z zestawem SDK iOS 8 znalazłem następującą kombinację:]}

  • dodaj UITextView do UITableViewCell i ogranicz go do boków
  • ustaw właściwość UITextView S scrollEnabled na NO. Po włączeniu przewijania ramka UITextView jest niezależna od rozmiaru zawartości, ale po wyłączeniu przewijania istnieje między nimi zależność.
  • Jeśli twoja tabela używa oryginalnej domyślnej wysokości wiersza 44, to będzie automatycznie obliczać wysokość wiersza, ale jeśli zmienisz domyślną wysokość wiersza na inną, być może będziesz musiał ręcznie włączyć automatyczne obliczanie wysokości wiersza w viewDidLoad:

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;
    

Dla dynamicznego rozmiaru tylko do odczytu UITextViews, to wszystko. Jeśli pozwalasz użytkownikom edytować tekst w UITextView, musisz również:

  • Zaimplementuj metodę textViewDidChange: protokołu UITextViewDelegate i powiedz tableView, aby przemalował się za każdym razem, gdy tekst jest edytowano:

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
    
  • I nie zapomnij ustawić gdzieś UITextView delegata, albo w Storyboard, albo w tableView:cellForRowAtIndexPath:

 85
Author: Brett Donald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 08:37:42

Swift:

textView.sizeToFit()
 53
Author: Juan Boero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 21:43:42

Just set

Kodem

textView.scrollEnabled = false

By Storyboard

Tutaj wpisz opis obrazka

Nie musisz robić nic poza tym.
 35
Author: Alok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 08:34:28

W moim (ograniczonym) doświadczeniu,

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

Nie respektuje znaków nowej linii, więc możesz skończyć z dużo krótszym CGSize niż jest to w rzeczywistości wymagane.

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

Wydaje się szanować nowe linie.

Tekst nie jest renderowany na górze UITextView. W moim kodzie ustawiłem nową wysokość UITextView na 24 piksele większą niż wysokość zwracana przez metody sizeOfFont.

 24
Author: user63934,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 12:47:24

W iOS6 możesz sprawdzić właściwość contentSize UITextView zaraz po ustawieniu tekstu. W iOS7 to już nie zadziała. Jeśli chcesz przywrócić to zachowanie dla iOS7, umieść poniższy kod w podklasie UITextView.

- (void)setText:(NSString *)text
{
    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    }
}
 22
Author: phatmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 22:19:34

Umieszczę właściwe rozwiązanie na dole strony, na wypadek, gdyby ktoś był odważny (lub wystarczająco rozpaczliwy), aby przeczytać do tego punktu.

Oto repo gitHub dla tych, którzy nie chcą czytać całego tekstu: resizableTextView

Działa to z iOs7 (i wierzę, że będzie działać z iOs8) i z autolayout. Nie potrzebujesz magicznych liczb, wyłącz układ i takie tam.Krótkie i eleganckie rozwiązanie.

Myślę, że wszystkie ograniczenia związane kod powinien przejść do metody updateConstraints. Więc stwórzmy własne ResizableTextView.

Pierwszy problem, z którym się tu spotykamy, polega na tym, że nie znamy rzeczywistej wielkości zawartości przed metodą viewDidLoad. Możemy wziąć długą i błędną drogę i obliczyć ją na podstawie wielkości czcionki, podziałów linii itp. Ale potrzebujemy solidnego rozwiązania, więc zrobimy: {]}

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

Więc teraz znamy prawdziwą treść bez względu na to gdzie jesteśmy: przed czy po viewDidLoad. Teraz dodaj ograniczenie wysokości w textView(za pomocą storyboard lub kodu, bez względu na to, jak). Dostosujemy się wartość z naszym contentSize.height:

[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
    if (constraint.firstAttribute == NSLayoutAttributeHeight) {
        constraint.constant = contentSize.height;
        *stop = YES;
    }
}];

Ostatnią rzeczą do zrobienia jest powiedzieć superclass updateConstraints.

[super updateConstraints];

Teraz nasza klasa wygląda tak:

ResizableTextView.m

- (void) updateConstraints {
    CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

    [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            constraint.constant = contentSize.height;
            *stop = YES;
        }
    }];

    [super updateConstraints];
}
Ładna i czysta, prawda? I nie musisz mieć do czynienia z tym kodem w swoich kontrolerach !

Ale czekaj! Y NO ANIMATION!

Możesz łatwo animować zmiany, aby textView rozciągały się płynnie. Oto przykład:

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        [self.view layoutIfNeeded];
    } completion:nil];
 18
Author: Nikita Took,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 07:43:39

Próbowałeś [textView sizeThatFits:textView.bounds]?

Edit: sizeThatFits zwraca rozmiar, ale nie zmienia rozmiaru komponentu. Nie jestem pewien, czy tego chcesz, czy raczej tego szukałeś. W obu przypadkach Nie wiem, czy będzie idealnie pasować do treści, jak chcesz, ale to pierwsza rzecz, aby spróbować.

 12
Author: Mike McMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 20:45:44

Inną metodą jest znalezienie rozmiaru, który dany łańcuch zajmie przy użyciu metody NSString:

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

Zwraca rozmiar prostokąta, który pasuje do podanego ciągu znaków z podaną czcionką. Przekaż w rozmiarze o żądanej szerokości i maksymalnej wysokości, a następnie możesz spojrzeć na wysokość zwróconą, aby dopasować tekst. Istnieje wersja, która pozwala określić tryb łamania linii również.

Możesz następnie użyć zwracanego rozmiaru, aby zmienić rozmiar widoku.

 9
Author: Code Addict,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 12:47:40

Jeśli nie masz pod ręką UITextView (na przykład rozmiar komórek widoku tabeli), będziesz musiał obliczyć rozmiar, mierząc ciąg znaków, a następnie rozliczając 8 pkt wypełnienia po każdej stronie UITextView. Na przykład, jeśli znasz żądaną szerokość widoku tekstowego i chcesz określić odpowiednią wysokość:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

Tutaj każda ósemka odpowiada jednej z czterech wyściełanych krawędzi, a 100000 służy tylko jako bardzo duży maksymalny rozmiar.

W praktyce warto dodać dodatkowe font.leading do wysokości; dodaje to pustą linię pod tekstem, która może wyglądać lepiej, jeśli są wizualnie ciężkie elementy sterujące bezpośrednio pod widokiem tekstu.

 8
Author: Brent Royal-Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 12:48:03

Wystarczy:

  1. pamiętaj tylko, aby ustawić scrolling enabled na NO dla Twojego UITextView:

Tutaj wpisz opis obrazka

  1. prawidłowo ustawić ograniczenia układu Auto.
Możesz nawet użyć UITableViewAutomaticDimension.
 7
Author: Bartłomiej Semańczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 10:18:23

Możemy to zrobić poprzez ograniczenia .

  1. Ustawia ograniczenia wysokości dla UITextView. Tutaj wpisz opis obrazka

2.Utwórz IBOutlet dla tego ograniczenia wysokości.

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3.nie zapomnij ustawić delegata dla widoku tekstowego.

4.

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

Następnie zaktualizuj swoje ograniczenie w ten sposób:)

 7
Author: Kishore Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-04 07:16:20

W połączeniu z odpowiedzią Mike ' a McMastera, możesz zrobić coś w stylu:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}
 6
Author: Olie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 04:31:12

Znalazłem sposób na zmianę wysokości pola tekstowego zgodnie z tekstem znajdującym się w nim, a także ułożenie etykiety pod nim na podstawie wysokości pola tekstowego! Oto kod.

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];
 6
Author: dheeraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-14 10:13:32

Faceci używający autolayout i twój sizetofit nie działa, to proszę sprawdzić ograniczenie szerokości raz. Jeśli przegapiłeś ograniczenie szerokości, wysokość będzie dokładna.

Nie trzeba używać żadnego innego API. tylko jedna linijka naprawiłaby cały problem.

[_textView sizeToFit];

Tutaj zajmowałem się tylko wysokością, utrzymując stałą szerokość i przegapiłem ograniczenie szerokości mojego widoku tekstowego w storyboardzie.

A to miało pokazać dynamiczną zawartość z usługi.

Mam nadzieję, że to pomoże..
 6
Author: Swaroop S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 06:58:22

Począwszy od iOS 8, możliwe jest korzystanie z funkcji automatycznego układu UITableView, aby automatycznie zmieniać rozmiar UITextView bez kodu niestandardowego. Umieściłem projekt w github , który demonstruje to w działaniu, ale oto klucz:

  1. UITextView musi mieć wyłączone przewijanie, co można zrobić programowo lub za pomocą Kreatora interfejsu. Nie zmieni rozmiaru, jeśli przewijanie jest włączone, ponieważ przewijanie umożliwia wyświetlanie większej zawartości.
  2. W viewDidLoad dla kontrolera UITableViewController, musisz ustawić wartość estimatedRowHeight, a następnie ustawić rowHeight na UITableViewAutomaticDimension.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. celem wdrożenia projektu musi być system iOS 8 lub nowszy.
 6
Author: Chuck Krutsinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-17 06:00:42

To działało ładnie, gdy musiałem dopasować tekst w {[1] } do konkretnego obszaru:

// The text must already be added to the subview, or contentviewsize will be wrong.

- (void) reduceFontToFit: (UITextView *)tv {
    UIFont *font = tv.font;
    double pointSize = font.pointSize;

    while (tv.contentSize.height > tv.frame.size.height && pointSize > 7.0) {
        pointSize -= 1.0;
        UIFont *newFont = [UIFont fontWithName:font.fontName size:pointSize];
        tv.font = newFont;
    }
    if (pointSize != font.pointSize)
        NSLog(@"font down to %.1f from %.1f", pointSize, tv.font.pointSize);
}
 4
Author: Bill Cheswick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 12:48:12

Oto wersja swift @jhibberd

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell
 4
Author: Fareed Alnamrouti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-07 16:02:09

W przypadku iOS 7.0 zamiast ustawiać frame.size.height na contentSize.height (który obecnie nic nie robi) użyj [textView sizeToFit].

Zobacz to pytanie .

 3
Author: Stian Høiland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:46

Przejrzałem wszystkie odpowiedzi i wszystkie mają stałą szerokość i regulują tylko wysokość. Jeśli chcesz dostosować również szerokość, możesz bardzo łatwo użyć tej metody:

Więc podczas konfigurowania widoku tekstowego, Ustaw scroll disabled

textView.isScrollEnabled = false

A następnie w metodzie delegate func textViewDidChange(_ textView: UITextView) Dodaj ten kod:

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

Wyjścia:

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

 3
Author: Peter Stajger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 14:12:23

Wyłącz przewijanie

Dodaj stałe

I dodaj swój tekst

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

Jeśli używasz UIScrollView powinieneś też dodać to;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}
 3
Author: alicanozkara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 08:31:20

Mam nadzieję, że to pomoże:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}
 1
Author: Dr. Marty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 17:31:32

Jeśli ktoś inny tu dotrze, To rozwiązanie działa dla mnie, 1 "Ronnie Liew"+4" user63934 " (mój tekst pochodzi z serwisu internetowego): Uwaga 1000 (nic nie może być tak duże "w moim przypadku")

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

I to jest... Cheers

 1
Author: Alejo JM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 01:56:34

Najlepszy sposób, jaki znalazłem, aby zmienić rozmiar UITextView zgodnie z rozmiarem tekstu.

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

Lub możesz użyć

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];
 1
Author: Manju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-06 06:32:29

Dla tych, którzy chcą, aby textview rzeczywiście przesunął się w górę i utrzymał pozycję dolnej linii

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}
 1
Author: Gal Blank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-30 21:43:46

Jedynym kodem, który będzie działał jest ten, który używa 'SizeToFit' jak w odpowiedzi jhibberd powyżej, ale w rzeczywistości nie odbierze go, chyba że wywołasz go w ViewDidAppear lub podłączysz go do zdarzenia UITextView text changed.

 1
Author: Mohammad Zekrallah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 08:25:57

Na podstawie odpowiedzi Nikity Takena doszedłem do następującego rozwiązania w Swift, które działa na iOS 8 z autolayout:

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }
 1
Author: Apfelsaft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 12:46:46

Szybka odpowiedź: Poniższy kod oblicza wysokość widoku tekstowego.

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

Teraz możesz ustawić wysokość widoku tekstu na myTextHeight

 1
Author: RawMean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 01:55:25

Oto odpowiedź, jeśli potrzebujesz dynamicznie zmienić rozmiar textView i tableViewCell w staticTableView

[https://stackoverflow.com/a/43137182/5360675][1]

 1
Author: Volodymyr Nazarkevych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:27