5

私はこれをうまく機能させていますが、のサイズがほぼいっぱいになった後でのみスクロールを開始するためにUITextView内部のテキストを取得することはできません。UITextViewの高さは4行ですが、2行目に達するとすぐに1行目は押し上げて、5行に達するまでビューのスクロールを開始したくありません。それがまったくスクロールしないようにするので、それは機能しませんでした。UITextViewUITextViewscrollingEnabled = NO

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

4 に答える 4

2

UITextView がロードされたら、scrollEnabled を NO に設定します。次に、テキスト ビューのデリゲートを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;
}
于 2012-07-04T17:46:55.210 に答える
2

を設定すると、contentInset内でテキストがより正確に表示されるようになる場合がありますUITextViewUITextViewただし、表示するテキストが少ないにもかかわらずスクロールが有効になっているという問題の解決には役立ちません。

同様に、 などの方法にsizeWithFontも制限があります。Mike Weller の優れたブログ シリーズiOS Development: You're Doing It Wrongで説明されNSStringているように、a の大きさについて質問するのは適切ではありませUIViewん。、などの多くのUIViewサブクラスには、サイジング時に考慮しなければならないインセットやその他の考慮事項があります。も例外ではありません。UILabelUIButtonUITextLabel

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

あなたのやり方は間違っている #2: -[NSString sizeWithFont:...] を使用してラベルのサイズを変更する

iOS 7UITextViewでは、textContainerInset. しかし、その間に何をすべきか?

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

テキストに基づいてスクロールする必要があるかどうかが既に計算されており、間違った答えが得られていることがわかっているためcontentSize、再度チェックアウトしても機能しません。boundsUIScrollView

これは、任意の調整値が助けになるところです! 私にとって、この値は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;
}
于 2013-10-15T14:12:01.973 に答える
2

同様の問題を抱えている他の人が言及しているように、小さなtextViewで答えが見つかりました。下部に32のパディングが自動的に追加されます。

簡単な修正は、私の問題を解決するメソッドYourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);内に追加することです!shouldChangeTextInRange

于 2012-07-05T03:13:44.187 に答える
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]
于 2012-07-04T17:43:32.577 に答える