私は深刻な問題を抱えており、直せないようで、過去2日間は非常識になりました。私は広範囲に検索しましたが、多くのことを試しましたが、解決策を見つけることができません。
UITextView
の中にUIScrollView
があります。テキストを表示するために、スクロールビュー内のUITextView
のサイズを動的に変更できます。しかし、UITextView
に非常に大きなテキストが含まれている場合、ほとんど最後までスクロールすると切り取られます。ただし、UIScrollView
のフレームはまだ正しいサイズになっています。
私はこれらの投稿を読みました: thisthis および多くの同様のもの。
UIScrollview
とUITextview
は両方とも、AutoLayoutを使用してxibで作成されます。
ここに私の現在のコードとスクリーンショットがあります。スクリーンショットの空白部分にテキストを入力してください。助けてください。
- (void)viewDidAppear:(BOOL)animated
{
CGRect frame = self.longDescField.frame;
frame.size.height = self.longDescField.contentSize.height;
self.longDescField.frame = frame;
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.longDescField.contentSize.height + 200);
self.scrollView.scrollEnabled = YES;
[self.scrollView flashScrollIndicators];
}
この問題はiOS 7以降に存在しており、iOS 12にも存在しています。
ただし、@ igzが推奨するように、サイズ変更の前にscrollEnabled = NO
を設定することにより、通常のスクロール動作を維持することができませんでした。代わりに、サイズ変更後にスクロールon
とoff
を切り替えました
// Resize text view here
textView.scrollEnabled = NO;
textView.scrollEnabled = YES;
これにより、切り取られたテキストが強制的に正しくレンダリングされました。
皆さん、助けてくれてありがとう。これが最終的にiOS7で私のために働いたものです。
この特定のxibで自動レイアウトを無効にするにする必要がありました。
その後、次のことを行いました。
[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
私にとっての解決策は、textViewをカスタマイズした後にsizeToFit
を置くことでした
[self.yourTextView sizeToFit];
これは、textviewを操作するときに最後に行うことであり、コンテンツテキストを入力する前ではありません。
間違いなくiOS7。 xibとコード生成の両方で、サイズ変更されたすべてのUITextViewに同じ問題が発生しました。 UITextViewフレームを変更した後、textContainer.sizeを調整する必要があることがわかりました。
TextContainer.sizeを調整するためにこのカテゴリコードを作成しましたが、テキスト値を設定した後も調整する必要があるようです。したがって、フレームサイズを設定しない場合は、テキストを変更した後にadjustAfterFrameChangeを呼び出す必要があります。このコードは、UITextViewがsetFrame:自体で何も実行していないことを前提としているため、setFrame:を取り出し、そのリスクを回避したい場合はadjustAfterFrameChangeを手動で呼び出します。
編集:変更
self.textContainer.size = self.frame.size; // fix for cut off text
に
self.textContainer.size = self.contentSize; // fix for cut off text
@interface UITextView(Extras)
- (void)adjustAfterFrameChange;
@end
@implementation UITextView(Extras)
- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
if ([self respondsToSelector:@selector(textContainer)])
self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self adjustAfterFrameChange];
}
@end
この問題は、連続レイアウトプロパティをfalseに設定することで修正できます。
textView.layoutManager.allowsNonContiguousLayout = false
ドキュメントにはデフォルト値がfalseであると記載されていますが、実際にはUITextViewの場合はtrueに設定されます。
テキストビューのサイズを変更すると、長いテキストが途切れるという同様の問題がありました。サイズ変更が修正される前にscrollingEnabledをオフにします。確かにIOS 7バグ。
これを試して
[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];
これは、UITextViewでのテキスト表示のカットオフに機能します。
これを試してみてください。
IOS 8およびXcode 6.3では、
textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
IOS7のロールアウトでこのような問題が発生しました。 UITextViewに新しい行を追加するsetTextを呼び出したとき、textviewは再描画に正しい新しい高さを使用していませんでした。 setNeedsDisplay、setNeedsLayout、レイヤーの再描画、ビュー全体の再描画などはすべて機能しませんでした。最後に、フォーカスの喪失と獲得を強制しました。
[textView resignFirstResponder];
[textView becomeFirstResponder];
これにより、高さの再計算と正しい再描画が強制されました。ありがたいことに、キーボードが飛び出したり入ったりすることはありませんが、アプリがサポートするすべてのiOSバージョンで回帰テストを行う価値があります。
同じ問題がありましたが、UITextViewの左半分または右半分が途切れていました。さまざまな携帯電話で、iOS 7とiOS 6の両方で発生しました。呼び出し:
myTextView.scrollEnabled = NO;
viewWillAppearで問題を回避しました。
テキストビュー(スクロールビューなし)でも同じ問題があります。これを解決するには(Xcode 7.3.1、iOS 9.3)、Attributes Inspectorで「Scrolling Enabled」のチェックを外すだけです。
これらの答えはどれも私にとってはうまくいきませんでした。
私は絵コンテにだまされていて、どういうわけか今はうまくいっています。ストーリーボードではまだ間違っているように見えますが、デバイスでは正常に表示されています。
さまざまなことを実行しました。これには、テキストフィールドの多くのオプションの切り替えも含まれます。
I 思考私にとってそれを修正したのはビューを大きくし、構築し、再び適切なサイズにする。
あいまいな不確かな答えをおaびしますが、おそらく役立つでしょう。このプロジェクトはもともとiOS 5向けに書かれたものであり、それ以来テキストビューはあまり混乱していなかったかもしれません。
これは、Interface Builderからもずっと発生します。
テキストビューを選択したら、[ユーティリティインスペクター]で[垂直インジケーターを表示]オプションをオフにします。切り取られたテキストが表示されます。
私は間違っているかもしれませんが、あなたの問題を完全に理解していませんが、UITextViewクラスでスクロール可能な複数行のテキスト領域の動作を実装しているため、UIScrollViewを使用するのは何ですか?
UIScrollViewは破棄する必要があります。
私は同じ状況に直面しています。 UITextViewのスクロールを無効にする必要があり、これを行うと最後の行がクリップされます。私の解決策は次のとおりです。
//In the UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
return NO;
}
return [super gestureRecognizerShouldBegin:gestureRecognizer];
}
In Swift=私は単にtextContainerInset
のUITextView
を設定することでこの問題を修正しました:
textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
bottom: 50.0, right: 0.0)