2012-07-04 9 views
5

UITextViewの中のテキストをUITextViewの中に入れて、スクロールを開始することはできません。 UITextViewは4行の高さですが、2行目に到達するとすぐに1行目がプッシュアップされ、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がNOにscrollEnabledロードされたセットです。その後selfにテキストビューのデリゲートを設定したり、他のオブジェクトと

- (void)textViewDidChange:(UITextView *)textView 

このメソッドはいつでも、ユーザーがビュー内のテキストへの変更を行うと呼ばれますUITextViewDelegateメソッドを実装します。このメソッドの内部では、テキストの大きさとテキストビューの範囲を超えているかどうかを調べる必要があります。そうなら、スクロールを有効にします。このメソッドを使用します。

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

ようなものになるだろう同様の問題を持つ他の人が言及を持っているように私はそれが自動的に下に32のパディングを追加し、小型のTextViewで、を答えを見つけました。

簡単な修正は、の方法の中にYourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);を追加することです。問題が修正されました。

2

contentInsetを設定すると、UITextView内のテキストがより正確に表示されます。ただし、それ以上のテキストを表示しなくてもUITextViewにスクロールが有効になっているという問題の解決には役立ちません。

同様に、sizeWithFontなどのメソッドには制限があります。 Mike Wellerの優れたブログシリーズiOS Development: You're Doing It Wrongで説明されているように、NSStringは、UIViewの大きさに関する質問には適していません。多くのUIViewサブクラス(UILabel,UIButtonなど)には、サイジング中に考慮する必要があるインセットやその他の考慮事項があります。 UITextLabelも例外ではありません。このテーマに関する

マイク・ウェラーの特定のエントリは次のとおりです。

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

iOSの7は、このようなtextContainerInsetなどのプロパティで、UITextViewに私たちに、より高度なテキスト処理をお約束します。しかし、その間に何をすべきか?

まず、UITextViewUIScrollViewのサブクラスです。したがって、contentSizeがビューのboundsプロパティより大きい場合、スクロールビューがスクロールしてより多くのコンテンツを表示できるという黄金ルールです。

UIScrollViewが既にテキストに基づいてスクロールするかどうかを計算していることがわかっているため、boundsが再び機能しません。

これは、任意の調整値が救助に来る場所です!私の場合、この値は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; 
} 
関連する問題