Bir UITextView öğesini içeriğine nasıl boyutlandırabilirim?


521

A'nın boyutunu UITextViewiçeriğine uyacak şekilde ayarlamanın iyi bir yolu var mı ? Diyelim ki bir UITextViewmetin satırı içeren bir var:

"Hello world"

Sonra başka bir metin satırı ekliyorum:

"Goodbye world"

rectAna görünümü buna göre ayarlayabilmem için, metin görünümündeki tüm satırları tutacak olan Cocoa Touch'da iyi bir yol var mı ?

Başka bir örnek olarak, Takvim uygulamasındaki etkinlikler için notların alanına bakın - hücrenin (ve UITextViewiçerdiği) notların dizesindeki tüm metin satırlarını tutmak için nasıl genişlediğine dikkat edin .


lütfen doğru cevabı güncellemeyi düşünün, kabul edilen hesaplamalar gereksiz hesaplamalara yol açtığından, şimdi bu sorun için bir contentSize özelliği var.
Juan Boero

Yanıtlar:


610

Bu hem iOS 6.1 hem de iOS 7 için çalışır:

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

Veya Swift'te (iOS 11'de Swift 4.1 ile çalışır)

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)

İOS 6.1 için destek istiyorsanız, ayrıca:

textview.scrollEnabled = NO;

1
Bir UITextView'ü UITableViewCell'de yeniden boyutlandırmak için iOS 7'de test edildi. Gerçekten harika çalışıyor. Sonunda benim için çalışan tek cevap bu. Teşekkürler!
Alex

37
textview.scrollEnabled = NO;
Brian

19
Bunun CGFLOAT_MAXyerine makro kullanmanızı öneririm MAXFLOAT. 32/64 bit platformların her ikisinde de uygundur.
Eonil

2
Sonraki satıra girmeden önce küçük dalgalanmalarla karşı karşıya kalan kişi bu `NSRange bottom = NSMakeRange (textView.text.length -1, 1); [textView scrollRangeToVisible: bottom]; ``
ajay_nasa

4
Swift sürümünde neden sizeThatFits (...) için iki ayrı çağrı var? İlk satır ne için?
nekonari

576

Bu artık iOS 7 veya daha yeni sürümlerde çalışmaz

Aslında UITextViewiçeriğin doğru yüksekliğine yeniden boyutlandırmanın çok kolay bir yolu var . Kullanılarak yapılabilir UITextView contentSize.

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

Nota bir şey doğru olmasıdır contentSizeyalnızca sonraUITextView birlikte görünümüne eklendi addSubview. Bundan önce eşittirframe.size

Otomatik düzen AÇIK ise bu çalışmaz. Otomatik mizanpajda, genel yaklaşım sizeThatFitsyöntemi kullanmak ve constantbir yükseklik sınırındaki değeri güncellemektir .

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

heightConstraint , özelliği bir storyboard'da oluşturulan yükseklik kısıtlamasına bağlayarak tipik olarak IBOutlet aracılığıyla ayarladığınız bir düzen kısıtlamasıdır.


Sadece bu şaşırtıcı cevaba, 2014 eklemek için:

[self.textView sizeToFit];

yalnızca iPhone6 ​​+ ile davranışta bir fark var :

resim açıklamasını buraya girin

Sadece 6+ ile (5s veya 6 değil) UITextView'e "bir tane daha boş satır" ekler. "RL çözümü" bunu mükemmel bir şekilde düzeltir:

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

6+ "ekstra hat" sorunu giderir.


2
Günümü kurtardın. Ben bunu unutmadan selfCalculating sınıf fonksiyon uzantısı ile mücadele ediyordu. Teşekkür ederim.
Lukasz

4
Aha! Metin görüntüleme yüksekliğini ayarlıyordum ve sonra içeren görünümün yüksekliğini ayarlıyordum. Görünüşe göre bunu yaptığımda metin görünüm yüksekliği ayarlandı. Kapsayıcı görüntüleme yüksekliğinin ayarlanması, ilk olarak işlerin beklendiği gibi çalışmasını sağlar (veya daha iyi, umulduğu gibi).
Hot Licks

11
[_TextView sizeToFit] kullanılması, contentSize özelliğini yenileyerek scrollView öğesine önceden ekleme gereksinimini ortadan kaldırır.
Rodrigo

1
Otomatik düzenleme kullanıyorsanız layoutIfNeeded, denetime başvurun. Sonra yüksekliği yakalayabilirsiniz contentSize.
phatmann

4
Yine de dış kabı yeniden boyutlandırmakla ilgili. Bu davranış iOS 7'de değişti. Bağlantılı soruda size sizeToFit ve layoutIfNeeded'in nereye ekleneceğini gösteriyorum.
Henrik Erlandsson

93

A UITextViewiçinde dinamik olarak boyutlandırma yapmak için UITableViewCell, aşağıdaki kombinasyonun iOS 8 SDK ile Xcode 6'da çalıştığını buldum:

  • Bir ekleme UITextViewa UITableViewCellve yanlarına bunu sınırlamak
  • UITextView'İn scrollEnabledözelliğini olarak ayarlayın NO. Kaydırma etkinken, UITextViewöğesinin çerçevesi içerik boyutundan bağımsızdır, ancak kaydırma devre dışı bırakıldığında ikisi arasında bir ilişki vardır.
  • Tablonuz orijinal varsayılan satır yüksekliği olan 44'ü kullanıyorsa, satır yüksekliklerini otomatik olarak hesaplar, ancak varsayılan satır yüksekliğini başka bir şeye değiştirdiyseniz, satır yüksekliklerinin otomatik olarak hesaplanmasını şu durumlarda manuel olarak açmanız gerekebilir viewDidLoad:

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

Salt okunur dinamik boyutlandırma UITextViewiçin bu kadar. Kullanıcıların içindeki metni düzenlemesine izin veriyorsanız UITextView, şunları da yapmanız gerekir:

  • Protokol textViewDidChange:yöntemini uygulayın ve metnin her düzenlenişinde kendini yeniden boyamasını UITextViewDelegatesöyleyin tableView:

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
  • Ve UITextViewdelegeyi içeride Storyboardveya içinde bir yere koymayı unutmayıntableView:cellForRowAtIndexPath:


Benim için en iyi cevap. Mükemmel çalıştı ve iOS 5'e UITableViewAutomaticDimension eklendi, böylece geriye dönük uyumlu.
smmelzer

4
Benim için pek işe yaramadı. TextViewDidChange yöntemi, her karakter yazdığımda tablo görünümümün sıçrama yapmasına neden olur. Ne öneririm o yöntemi kullanmak yerine, tableView: cellForRowAtIndexPath yönteminde, üzerinde textview olan satır için, salt okunur bir modda .scrollEnabled NO olarak ayarlanmışsanız ve bir düzenleme görünümü kümesindeyseniz kaydırma EVET olarak etkinleştirildi. Bu şekilde sadece görüntülerken her zaman tam metni gösterecek ve düzenlerken tam metinle başlayacak ve daha fazla metin ekledikçe, daha önceki metin üstte
kayarken

3
Ayrıca, boş bir metin alanının yüksekliği olmadığı ve düzenlemeye başlamak için dokunamayacağı için metin görünümüne> = yükseklik kısıtlaması ekledim.
SimonTheDiver

Mükemmel çözüm. Benim tableView.rowHeight = UITableViewAutomaticDimensioniçin gereksizdi.
Christopher Pickslay

Tekrar teşekkürler Brett Donald! Bunu nasıl yapacağımı unuttum ve cevabınızı 1 yıl sonra tekrar buldum 😀.
Eric Conner

75

Her ikisi de kod ve film şeridi kullanarak çok kolay çalışma çözümü.

Kod ile

textView.scrollEnabled = false

Storyboard Tarafından

Kaydırma Etkinleştir'in işaretini kaldırın

resim açıklamasını buraya girin

Bunun dışında hiçbir şey yapmanıza gerek yok.


5
Bu cevap doğrudur. StoryBoard'da, tıpkı bir UILabel gibi TextView AutoSize var. Tek yapmamız gereken scrollEnabled = false olarak ayarlamaktır.
pnavk

4
Temel olarak, bu doğrudur: Otomatik Yerleşim kısıtlamaları kullanıyorsanız ve kaydırmayı kapatırsanız, her şey işe yarar.
Dan Rosenstark

2
Çok teşekkürler. Bu kadar basitti, film şeridinde veya kodda kaydırmayı devre dışı bırak, 0 satırlı UILabel gibi olacak.
samir105

@Mansuu .... Bu, gerçek içerik boyutunu geçersiz kılmak için yapabileceğiniz şeyler olduğu için garantili bir çözüm değildir ve görünüm yerleştirildikten sonra metni değiştirirseniz, kadar. Ancak, bu şeyler bir metin alanında da numberOfLines = 0 ayarı için geçerli kalır. Bu işe yaramazsa, muhtemelen örtük olarak bir yükseklik ayarlayacak başka kısıtlamalarınız vardır.
Jake T.

2
@iOS yükseklik kısıtlaması ekliyorsanız, kısıtlamaları daha düşük bir öncelik haline getirin, aksi takdirde çalışmaz.
Alok

61

Swift:

textView.sizeToFit()

14
Buna ek olarak, bunun çalışması için kaydırmayı etkin olarak false olarak ayarlamam gerektiğini buldum. textView.scrollEnabled = false
tmarkiewicz

1
TextView.sizeToFit ()
Daniel Kuta

5
@tmarkiewicz Metin, cihazınızın ekranına sığdığında çalışır, ancak metniniz ekranda bulunan alandan daha büyük olduğunda sorun olur. Metnin geri kalanını görmek için metni kaydıramazsınız.
Francisco Romero

Cevap bu!!! Daha karmaşık çözümlere gerek yok !!! @FranciscoRomero Neden bir tablo hücresine veya koleksiyon görünümü hücresine metin görünümünü koymuyorsunuz, o zaman her zaman tabloyu veya koleksiyon görünümünü kaydırabilirsiniz ....
Ben Smith

23

Benim (sınırlı) tecrübemde,

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

yeni satır karakterlerine saygı göstermediğinden CGSize, gerçekten gerekenden çok daha kısa bir sonuç elde edebilirsiniz.

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

yeni satırlara saygı duyuyor gibi görünüyor.

Ayrıca, metin aslında UITextView. Kodumda, yeni yüksekliğini yöntemlerin UITextViewdöndürdüğü yükseklikten 24 piksel daha büyük olacak şekilde ayarladım sizeOfFont.


3
Bu, boyutu bir UILabel üzerine çiziyormuş gibi boyut alır. Bu boyutu uitextview'in çerçevesine ayarlarsanız, yine de içinde bazı kaydırmalar yapmanız gerekir.
Kevlar

22

İOS6'da, contentSizemetni ayarladıktan hemen sonra UITextView özelliğini kontrol edebilirsiniz . İOS7'de bu artık çalışmaz. İOS7 için bu davranışı geri yüklemek istiyorsanız, aşağıdaki kodu UITextView alt sınıfına yerleştirin.

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

2
Bununla ilgili daha fazla bilgiyi nerede bulabilirim? İOS 7'de bununla ilgili yeni görünen davranıştan tamamen kayboldum.
Stian Høiland

Değişken CGSize boyutunun anlamı nedir?
Tchelow

Boyutu kaldırdım, orada olmaması gerekiyordu.
phatmann

18

Birisi bu noktaya okumak için cesur (veya yeterince umutsuz) olması durumunda sayfanın altına doğru çözümü gönderirim.

İşte tüm bu metni okumak istemeyenler için gitHub repo: resizableTextView

Bu, iOs7 (ve iOs8 ile çalışacağına inanıyorum) ve autolayout ile çalışır. Sihirli numaralara, düzeni devre dışı bırakmanıza ve bunun gibi şeylere ihtiyacınız yoktur.Kısa ve zarif bir çözüm.

Bence, kısıtlama ile ilgili tüm kodlar updateConstraintsyönteme geçmelidir . Öyleyse, kendimizi yaratalım ResizableTextView.

Burada karşılaştığımız ilk sorun, viewDidLoadyöntemden önce gerçek içerik boyutunu bilmemektir . Uzun ve buggy bir yol alabilir ve yazı tipi boyutuna, satır sonlarına vb. Dayalı olarak hesaplayabiliriz.

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

Şimdi nerede olduğumuza bakılmaksızın gerçek içeriği biliyoruz: önce veya sonra viewDidLoad. Şimdi textView'e yükseklik kısıtlaması ekleyin (film şeridi veya kod aracılığıyla, nasıl olursa olsun). Bu değeri aşağıdakilerle ayarlayacağız contentSize.height:

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

Yapılacak son şey süper sınıfa anlatmak updateConstraints.

[super updateConstraints];

Şimdi sınıfımız şöyle görünüyor:

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

Güzel ve temiz, değil mi? Ve kontrolörlerinizde bu kodla uğraşmanıza gerek yok !

Fakat bekle! Y HAYIR CANLANDIRMA!

Kolayca textViewgermek için değişiklikleri kolayca canlandırabilirsiniz . İşte bir örnek:

    [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];

4
Kullan CGFLOAT_MAX, değil FLT_MAX.
rob mayoff

Keşke bu harika çözüm için birden fazla oy verebilseydim !!
Scooter

13

Denedin mi [textView sizeThatFits:textView.bounds] mi

Edit: sizeThatFits boyutu döndürür ancak bileşeni yeniden boyutlandırmaz. İstediğiniz şeyin bu olup olmadığından veya [textView sizeToFit]aradığınızdan daha fazlası olup olmadığından emin değilim . Her iki durumda da, istediğiniz içeriğe mükemmel bir şekilde uyup uymayacağını bilmiyorum, ancak denemek için ilk şey.


2
sizetofit günü kurtarıyor
michaelsnowden

9

Başka bir yöntem, yöntemi kullanarak belirli bir dizenin alacağı boyutu bulmaktır NSString:

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

Bu, verilen dizeye verilen yazı tipiyle uyan dikdörtgenin boyutunu döndürür. İstenen genişliğe ve maksimum yüksekliğe sahip bir boyutta geçin ve sonra metne sığacak şekilde döndürülen yüksekliğe bakabilirsiniz. Satır sonu modunu da belirlemenizi sağlayan bir sürüm var.

Ardından, görünümünüzün boyutunu sığdırmak için döndürülen boyutu kullanabilirsiniz.


8

Eğer yoksa UITextViewkullanışlı (örneğin, boyutlandırma ediyoruz tablo görünümü hücrelerini), sonra bir her bir tarafına dolgu 8 punto için muhasebe, dize ölçerek boyutunu hesaplamak gerekir UITextView. Örneğin, metin görünümünüzün istenen genişliğini biliyorsanız ve ilgili yüksekliği bulmak istiyorsanız:

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

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

Burada, her 8 dört yastıklı kenardan birini oluşturuyor ve 100000 sadece çok büyük bir maksimum boyut olarak hizmet ediyor.

Pratikte, font.leadingyüksekliğe bir ekstra eklemek isteyebilirsiniz ; bu, metninizin altına, metin görünümünün hemen altında görsel olarak ağır denetimler varsa daha iyi görünebilecek boş bir satır ekler.


8.1'de mükemmel sonuç
Mantık

Dolgu benim için anahtar oldu
thibaut noah

8

Bunu kısıtlamalarla yapabiliriz.

  1. UITextView için Yükseklik sınırlamalarını ayarlayın. resim açıklamasını buraya girin

2.Yükseklik sınırlaması için IBOutlet'i oluşturun.

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

3. metin görünümünüz için delege ayarlamayı unutmayın.

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

}

sonra kısıtlamanızı bu şekilde güncelleyin :)


Bu FANTASTİK bir takma ad!
Fattie

Sabitin ayarlanmasının ardından [textView layoutIfNeeded]; animasyon bloğunda. (Autolayout animasyonları böyle yapar.)
Will Larche

7

Aşağıdaki şeyler yeterlidir:

  1. Set Sadece hatırlamak kaydırma etkin üzere NO şunlara ait UITextView:

resim açıklamasını buraya girin

  1. Otomatik Düzen Kısıtlamalarını doğru şekilde ayarlayın.

Hatta kullanabilirsiniz UITableViewAutomaticDimension.


6

Mike McMaster'ın cevabı ile birlikte, şöyle bir şey yapmak isteyebilirsiniz:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}

6

İçindeki metne göre bir metin alanının yüksekliğini yeniden boyutlandırmanın ve metin alanının yüksekliğine bağlı olarak altında bir etiket düzenlemenin bir yolunu buldum! İşte 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];

Burada UILabel'in y - koordinatındaki '5', textView ve Label arasında istediğim boşluktur.
dheeraj

6

Autolayout kullanan ve bedeninize uygun olan çocuklar çalışmıyor, lütfen genişlik sınırınızı bir kez kontrol edin. Genişlik sınırlamasını kaçırdıysanız, yükseklik doğru olacaktır.

Başka bir API kullanmaya gerek yoktur. sadece bir satır tüm sorunu çözecektir.

[_textView sizeToFit];

Burada, yalnızca yükseklikle ilgiliydim, genişliği sabit tuttum ve film şeridimdeki TextView'imin genişlik kısıtlamasını kaçırmıştım.

Bu da hizmetlerin dinamik içeriğini göstermekti.

Umarım bu yardımcı olabilir ..


6

İOS 8'den başlayarak, özel bir kod olmadan bir UITextView'ü otomatik olarak yeniden boyutlandırmak için UITableView'ın otomatik düzen özelliklerini kullanmak mümkündür. Bunu eylem gösteren github bir proje koydum , ama işte anahtar:

  1. UITextView programının programlı olarak veya arayüz oluşturucu aracılığıyla yapabileceğiniz kaydırma devre dışı olmalıdır. Kaydırma etkinleştirilmişse yeniden boyutlandırılmaz, çünkü kaydırma daha büyük içeriği görüntülemenizi sağlar.
  2. UITableViewController için viewDidLoad olarak, estimatedRowHeight için bir değer ayarlamanız gerekir ve ardından ayarlamak rowHeightiçin UITableViewAutomaticDimension.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. Proje dağıtım hedefi iOS 8 veya üstü olmalıdır.

1
Bu tür cevaplar önerilmez. İlgili kodu buraya göndermelisiniz.
Antzi

5

Tüm cevapları gözden geçirdim ve hepsi sabit genişliği koruyor ve sadece yüksekliği ayarlıyor. Genişliği de ayarlamak isterseniz, bu yöntemi çok kolay bir şekilde kullanabilirsiniz:

böylece metin görünümünüzü yapılandırırken kaydırma özelliğini devre dışı bırakın

textView.isScrollEnabled = false

ve sonra delege yönteminde func textViewDidChange(_ textView: UITextView)şu kodu ekleyin:

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

Çıktılar:

resim açıklamasını buraya girin

resim açıklamasını buraya girin


temsilci yöntemi @Peter Stajger
Mansuu çağrılmıyor ....

4

UITextViewBelirli bir alanda uygun bir metin yapmak gerektiğinde bu güzel çalıştı :

// Metnin alt görünüme zaten eklenmiş olması gerekir, aksi takdirde contentviewsize yanlış olur.

- (geçersiz) 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 (@ "% .1f'den% .1f'ye kadar font," pointSize, tv.font.pointSize);
}

4

İşte @jhibberd'in hızlı sürümü

    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

6
Soru gerçekten dil bilincidir. UIKit ile ilgili soruların tüm cevapları için geri dönüp hızlı bağlantı noktaları yazmak gerçekten gerekli mi? Gürültülü bir konuşma yapıyor gibi görünüyor.
eremzeit

Bu soruların çoğunun belirli bir programlama dili olmaması sorunu, bu yüzden hızlı bir dil
arasanız

4

kaydırmayı devre dışı bırak

constain ekle

ve metninizi ekleyin

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

kullanırsanız UIScrollViewbunu da eklemelisiniz;

[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

İOS 7.0 frame.size.heightiçin, contentSize.height(şu anda hiçbir şey yapmıyor) olarak ayarlamak yerine kullanın [textView sizeToFit].

Bu soruya bakın .


2

UITextViewDelegate kullanmak en kolay yoldur:

func textViewDidChange(_ textView: UITextView) {
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height
}

1

Bu yardımcı olur umarım:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}

Bu işe yaramıyor! Bir hataya neden olur: "Görevin sol işleneni olarak lvalue gerekli"
Leviathan

Yalnızca atayabilirsiniz textView.frame.
jweyrich

1

başka biri buraya gelirse, bu çözüm benim için çalışıyor, 1 "Ronnie Liew" +4 "user63934" (Metnim web hizmetinden geliyor): 1000'i not edin (hiçbir şey benim durumumda bu kadar büyük olamaz))

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;

Ve bu ... Şerefe


1

UITextView yüksekliğini metnin boyutuna göre yeniden boyutlandırmanın en iyi yolu.

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

veya KULLANABİLİRSİNİZ

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

1

Metin görünümünün gerçekten yukarı çıkmasını ve alt satırdaki konumunu korumasını isteyenler için

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

Çalışacak tek kod, yukarıdaki jhibberd yanıtında olduğu gibi 'SizeToFit' kullanan koddur, ancak ViewDidAppear'da çağrılmadıkça veya UITextView metin değiştirildi olayına kablolamadığınız sürece almaz .


1

Nikita Took'un cevabına dayanarak, Swift'te iOS 8'de otomatik yerleşim ile çalışan aşağıdaki çözüme geldim:

    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

Hızlı yanıt: Aşağıdaki kod, textView öğenizin yüksekliğini hesaplar.

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

Artık metninizin yüksekliğini myTextHeight


Üzgünüz, bu ne anlama geliyor: let attribute = [NSFontAttributeName: textView.text.font!] Bu gerçekten hatasız Swift kodu mu?) Bunu mu demek istediniz? let attribute = [NSFontAttributeName: textView.font!]
Massmaker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.