テキストが UITextView の境界を超え、ユーザーがスクロールする必要がある場合を知りたいです。特定のフォントが何行を占めるかを知っていても役に立ちません。特定の量のテキストが何行を占めるかをどうやって知ることができますか?
上の画像では、フェード効果を追加して、テキスト ビューを適切に切り取ることができるようにします。ただし、スクロールするのに十分なテキストがない場合、フェードを表示するのは正しくありません。
テキストが UITextView の境界を超え、ユーザーがスクロールする必要がある場合を知りたいです。特定のフォントが何行を占めるかを知っていても役に立ちません。特定の量のテキストが何行を占めるかをどうやって知ることができますか?
上の画像では、フェード効果を追加して、テキスト ビューを適切に切り取ることができるようにします。ただし、スクロールするのに十分なテキストがない場合、フェードを表示するのは正しくありません。
contentSize
テキストを設定して取得します。これは CGSize であり、height
UITextView がスクロールせずにテキストを表示するために必要な高さになります。
myTextView.text = someText;
CGSize textSize = myTextView.contentSize;
float verticalSpaceNeededByText = textSize.height;
テキストビューの属性付きテキストを取得し、次の方法を使用してサイズを計算します。
- (CGSize) size;
次に、テキストビューの境界とこのUIFontのプロパティを知って仕事をすることができます。
@property(nonatomic,readonly) CGFloat lineHeight;
属性付き文字列のサイズは、テキストが同じ行にあると見なされるため、長さに対してのみ有用であることに注意してください。また、行間のスペースは考慮されません。
アプリケーション内のいくつかの場所でいくつかの使用法を呼び出すことができるカスタムappDelegateメソッドを作成します。ビュー内のテキストに完全にフィットする高さ、カスタムセルの高さ、動的テキストデータを使用したテーブル行の高さ、textViewsなどを決定するのに便利です。
これは非常に柔軟性があり、画面、コンテナ、またはビューにテキストを完全に表示するために必要な「知覚される」高さを簡単に判断できます。
結果を取得したら、次のように、textViewの高さのサイズと比較することができます。
TextViewのHeightとTextViewのtextContainerの高さの間に小さなバッファがあることに注意してください。非常に最小限ですが、(TextView.frame.size.height -3)よりもわずかに小さいMinHeightを送信することで調整できます。
オプションのパディングを使用して、必要に応じて他のサイズの小さなバッファーを作成することもできます。これにより、より大きなコンテナーが返されます。
カスタムフォントを使用する場合は、新しい変数でそれを補正し、それを考慮に入れますが、現状では、これはシステムフォントに最適です。
ロジックの例:
//Logic Example:
if([appDelegate calculateTextHeight:@"Your_String_Passed_In_Here"] > textView.frame.size.height) {
//Text will exceed Height of TextView and require scroll.
}else {
//Text is within the TextView without need to scroll.
}
方法:
-(NSInteger)calculateTextHeight:(NSString *)text:(NSInteger)FontSize:(NSInteger)MaxWidth:(NSInteger)MinHeight:(NSInteger)optionalHeightPadding {
//Determine the Size based on the Inputs:
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FontSize] constrainedToSize:CGSizeMake(MaxWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
//Add Optional Padding:
int calH = size.height + optionalHeightPadding;
//Determine if larger than Min:
if (calH > MinHeight) {
return size.height + optionalHeightPadding;
}
//Return Min
return MinHeight;
}
注意:以前はUILineBreakModeWordWrap を使用していましたが、iOS 6で非推奨になり、代わりにNSLineBreakByWordWrappingを使用します。