2014-01-08 81 views
1

這很奇怪我一直在尋找這個答案,但似乎沒有任何工作!UITextView sizeToFit無法正常工作

我有簡單UITextView,我試圖根據其內容物在的viewController來調整:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; 

    self.textView.text = lorum; 

    self.textView.scrollEnabled = NO; 
    [self.textView sizeToFit]; 
    [self.textView layoutIfNeeded]; 
} 

但是,這是我結束了:

enter image description here

上午我錯過明顯的東西?

更新時間(幀背景):

enter image description here

+0

可能的重複[奇怪的事情發生在IOS7中使用UITextView sizetofit時](http://stackoverflow.com/questions/18928832/weird-thing-occurs-when-using-sizetofit-of-a-uitextview- in-ios7) – Jeremy

+0

不是重複...這是一個不同的問題 – Allen

+0

@Jeremy請刪除重複的標籤......一個人說,文本已被切斷。我的意思是說框架沒有適應多行文字。 – Allen

回答

3

正如我在評論中寫道,在我看來,如果你不想的UITextView的滾動使用,我建議使用一個簡單的UILabel ..這是代碼:

編輯:,如果你想使用的UITextView由於某種原因,像可編輯的文本或可選擇的文本,你可以使用相同的代碼進行一些修改(我在這樣的評語代碼添加此修改)

EDI T2如果你的標籤是在分鏡檢查約束或刪除自動佈局

.H

@interface ViewController : UIViewController { 

    IBOutlet UILabel *label; 

    } 

。米

- (void)viewDidLoad { 
    [super viewDidLoad]; 

// UILabel *label = [[UILabel alloc] init]; 
    label.backgroundColor = [UIColor lightGrayColor]; 

    NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; 

    //for use labrect with UITextView you set the font of UITextView: 
    //label.font = [UIFont systemFontOfSize:17];  

    CGSize maxSize = CGSizeMake(320, 410); 
    CGRect labrect = [lorum boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:Nil]; 

    label.text = lorum; 
    //for use UITextView you should comment the line under 
    label.numberOfLines = 0; 
    label.frame = CGRectMake(0, 30, 320, labrect.size.height); 

// [self.view addSubview:label]; 

    }; 

enter image description here

+0

是否可以修改視圖中已有的* uilabel? – Allen

+0

@艾倫是的,這是可能的..我編輯我的代碼,如果你想使用UITextView – Ilario

+0

謝謝,但它可以做到這一點已經存在的uilabel?這意味着我已經在我的xib/storyboard中擁有了它,並且我沒有調用[self.view addSubview:label]; – Allen

-1

嘗試手動調整幀的大小。

self.textView.text = lorum; 
CGSize size = [lorum sizeWithFont:self.textView.font 
         constrainedToSize:CGSizeMake(self.textView.frame.size.width, 9999) 
          lineBreakMode:UILineBreakModeWordWrap]; 
CGRect frame = self.textView.frame; 
frame.size.width = size.width; 
frame.size.height = size.height; 
self.textView.frame = frame; 

這應該將您的textview的大小設置爲文本的大小(限制爲您的textView的寬度)。原點應該保持不變。我知道sizeToFit只收縮框架,它不會擴大它。所以如果你的框架最初只有一條線高,它將只保留一條線。

或者,您可以將textView的框架設置爲您的整個窗口,然後使用sizeToFit並且應該正常工作。

編輯:

爲了避免過時的功能,你也可以使用

CGSize size = [lorum sizeWithAttributes:@{NSFontAttributeName:self.textView.font}]; 

CGRect rect = [text boundingRectWithSize:(CGSize){ .width = self.textView.frame.size.width, .height = CGFLOAT_MAX } options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName = self.textView.font } context:nil]; 
+0

不起作用,方法sizeWithFont ...在iOS7中已棄用 – Allen

+1

然後使用'[lorum sizeWithAttributes:@ {NSFontAttributeName: self.textView.font}];'或'[text boundingRectWithSize :(CGSize){.width = self.textView.frame.size.width,.height = CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin attributes:@ {NSFontAttributeName = self。 textView.font} context:nil];' – Putz1103

+0

在textView(self.textView.size = size;)上未找到屬性大小。 frame.size不可分配 – Allen

0

您是否嘗試過使用UIViewContentMode

例如:

[self.textView setContentMode:UIViewContentModeScaleToFill]; 
+0

它不起作用 – Allen

+2

@Allen你向我投了一個建議嗎?糟糕的一天呢?提醒我不要再提供任何建議? – andrewbuilder

+0

抱歉不是個人的!只是想讓工作的答案浮到頂端 – Allen

4

https://medium.com/ios-os-x-development/102e73853fbc

看看這個解決方案。它爲我工作!

您只需在視圖控制器中的插座上添加高度約束。然後將以下行添加到viewDidAppear方法中:

CGSize size = self.textView.contentSize; self.textViewHeightConstraint.constant = size.height;

如果您點擊鏈接,有一個示例項目。

+1

有人可以解釋爲什麼這個作品在viewdidappear但viewdidlayoutsubviews不? – ullstrm

+0

我認爲這是最好的解決方案,容易理解爲什麼sizeToFit對Textview沒有影響,因爲在textview裏面是一個scrollview。所以我們需要更新約束高度,而不是sizeToFit。 –

+0

@Spoek:此解決方案適用於viewdidappear或viewdidlayoutsubviews。我剛剛檢查過。 –