2012-07-04 87 views
5

我有這個UITextView這個效果很好,除了我不能讓UITextView裏面的文字在UITextView的尺寸接近完整後纔開始滾動, UITextView是4行高的,但是一旦我到達第二行,第一行就被推高了,我不希望視圖開始滾動,直到我到達第5行。 scrollingEnabled = NO使它無法滾動,所以這沒有奏效。我怎樣才能讓UITextView只在滿文時滾動

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

回答

0

您可以使用sizeWithFont:constrainedToSize:lineBreakMode:方法來檢查您的字符串是否會真正的渲染速度比你的文本查看大圖,看看你是否需要啓用滾動。但是,只要設置了滾動視圖中的文本,就必須調用它。

例如:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

當你的UITextView被加載到scrollEnabled沒有設置。然後設置文本視圖的委託self或其他一些對象,並實施UITextViewDelegate方法

- (void)textViewDidChange:(UITextView *)textView 

這種方法將被調用任何時候用戶更改到視圖中的文本。在這個方法裏面,你需要弄清楚你的文本有多大,以及它是否超出了文本視圖的範圍。如果是這樣你啓用滾動。使用此方法:

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

這是NSString上的UIKit類別方法。它返回一個CGSize,它會告訴你所調用的任何文本字符串的高度。在你的情況下,它會是這樣

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

我找到了答案,正如其他有類似問題的有提到,用小的TextView,它會自動將32填充到了谷底。

一個簡單的修復方法是在shouldChangeTextInRange裏面添加YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);方法,這就解決了我的問題!

2

設置contentInset可能有助於文本在UITextView內更正確地顯示。但是,它不會幫助解決UITextView儘管沒有更多文本可以查看但已啓用滾動的問題。

同樣,諸如sizeWithFont等方法也有侷限性。正如邁克韋勒的優秀博客系列iOS Development: You're Doing It WrongNSString中所解釋的那樣,對於UIView應該有多大而言,並不是一個好問題。很多UIView子類,如UILabel,UIButton等有插入和其他考慮因素,必須考慮在大小。 UITextLabel也不例外。

邁克·韋勒對這個問題特別的條目是:

You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]

的iOS 7的承諾我們更復雜的文本處理中UITextView,與諸如textContainerInset性能。但在此期間該做什麼?那麼,首先我們知道UITextViewUIScrollView的一個子類。因此,如果contentSize大於視圖的bounds屬性,則滾動視圖將滾動以便我們可以看到更多內容。

檢出contentSize agains的bounds將無法​​工作或者是因爲我們知道,UIScrollView已經計算基於文本是否應該滾動或沒有,它給了我們錯誤的答案。

這是任意調整值來救援的地方!對我來說,這個值是17.f。對於你 - 取決於你的字體 - 它可能不同。然後,我們控制並決定是否允許滾動視圖滾動:

static const CGFloat kArbritaryHeight = 17.f; 
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight; 
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds); 
BOOL tooMuchContent = adjustedContentHeight > boundsHeight; 

if (tooMuchContent) 
{ 
    myTextView.scrollEnabled = YES; 
} 
else 
{ 
    myTextView.scrollEnabled = NO; 
}