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.
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;
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:
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+.
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
doUITableViewCell
i ogranicz go do boków - ustaw właściwość
UITextView
SscrollEnabled
naNO
. Po włączeniu przewijania ramkaUITextView
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 UITextView
s, to wszystko. Jeśli pozwalasz użytkownikom edytować tekst w UITextView
, musisz również:
-
Zaimplementuj metodę
textViewDidChange:
protokołuUITextViewDelegate
i powiedztableView
, 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 wStoryboard
, albo wtableView:cellForRowAtIndexPath:
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()
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
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
.
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;
}
}
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];
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ć.
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.
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.
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:
- pamiętaj tylko, aby ustawić scrolling enabled na NO dla Twojego
UITextView
:
- prawidłowo ustawić ograniczenia układu Auto.
UITableViewAutomaticDimension
.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 .
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:)
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.
}
}
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];
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..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:
- 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.
- W viewDidLoad dla kontrolera UITableViewController, musisz ustawić wartość estimatedRowHeight, a następnie ustawić
rowHeight
naUITableViewAutomaticDimension
.
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = self.tableView.rowHeight;
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
- celem wdrożenia projektu musi być system iOS 8 lub nowszy.
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); }
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
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 .
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:
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;
}
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;
}
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
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];
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);
}
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.
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
}
}
}
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
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
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