web-dev-qa-db-ja.com

UIScrollView内のUITextViewで大きなテキストが途切れる

私は深刻な問題を抱えており、直せないようで、過去2日間は非常識になりました。私は広範囲に検索しましたが、多くのことを試しましたが、解決策を見つけることができません。

UITextViewの中にUIScrollViewがあります。テキストを表示するために、スクロールビュー内のUITextViewのサイズを動的に変更できます。しかし、UITextViewに非常に大きなテキストが含まれている場合、ほとんど最後までスクロールすると切り取られます。ただし、UIScrollViewのフレームはまだ正しいサイズになっています。

私はこれらの投稿を読みました: thisthis および多くの同様のもの。

UIScrollviewUITextviewは両方とも、AutoLayoutを使用してxibで作成されます。

ここに私の現在のコードとスクリーンショットがあります。スクリーンショットの空白部分にテキストを入力してください。助けてください。

enter image description here

- (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];
}
54
sudo

この問題はiOS 7以降に存在しており、iOS 12にも存在しています。

ただし、@ igzが推奨するように、サイズ変更の前にscrollEnabled = NOを設定することにより、通常のスクロール動作を維持することができませんでした。代わりに、サイズ変更後にスクロールonoffを切り替えました

// Resize text view here

textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

これにより、切り取られたテキストが強制的に正しくレンダリングされました。

131
Mike

皆さん、助けてくれてありがとう。これが最終的にiOS7で私のために働いたものです。

この特定のxibで自動レイアウトを無効にするにする必要がありました。

その後、次のことを行いました。

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
15
sudo

私にとっての解決策は、textViewをカスタマイズした後にsizeToFitを置くことでした

[self.yourTextView sizeToFit];

これは、textviewを操作するときに最後に行うことであり、コンテンツテキストを入力する前ではありません。

10
meda

間違いなく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
7
K1w1Geek

この問題は、連続レイアウトプロパティをfalseに設定することで修正できます。

textView.layoutManager.allowsNonContiguousLayout = false

ドキュメントにはデフォルト値がfalseであると記載されていますが、実際にはUITextViewの場合はtrueに設定されます。

5
ArunGJ

テキストビューのサイズを変更すると、長いテキストが途切れるという同様の問題がありました。サイズ変更が修正される前にscrollingEnabledをオフにします。確かにIOS 7バグ。

5
igz

これを試して

[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];

これは、UITextViewでのテキスト表示のカットオフに機能します。

5
zedzhao

これを試してみてください。

IOS 8およびXcode 6.3では、

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
2
Rana Raza

IOS7のロールアウトでこのような問題が発生しました。 UITextViewに新しい行を追加するsetTextを呼び出したとき、textviewは再描画に正しい新しい高さを使用していませんでした。 setNeedsDisplay、setNeedsLayout、レイヤーの再描画、ビュー全体の再描画などはすべて機能しませんでした。最後に、フォーカスの喪失と獲得を強制しました。

[textView resignFirstResponder];
[textView becomeFirstResponder];

これにより、高さの再計算と正しい再描画が強制されました。ありがたいことに、キーボードが飛び出したり入ったりすることはありませんが、アプリがサポートするすべてのiOSバージョンで回帰テストを行う価値があります。

1
Kelly

同じ問題がありましたが、UITextViewの左半分または右半分が途切れていました。さまざまな携帯電話で、iOS 7とiOS 6の両方で発生しました。呼び出し:

myTextView.scrollEnabled = NO;

viewWillAppearで問題を回避しました。

1
jlegakis

テキストビュー(スクロールビューなし)でも同じ問題があります。これを解決するには(Xcode 7.3.1、iOS 9.3)、Attributes Inspectorで「Scrolling Enabled」のチェックを外すだけです。

1
Francesco

これらの答えはどれも私にとってはうまくいきませんでした。

私は絵コンテにだまされていて、どういうわけか今はうまくいっています。ストーリーボードではまだ間違っているように見えますが、デバイスでは正常に表示されています。

さまざまなことを実行しました。これには、テキストフィールドの多くのオプションの切り替えも含まれます。

I 思考私にとってそれを修正したのはビューを大きくし、構築し、再び適切なサイズにする

あいまいな不確かな答えをおaびしますが、おそらく役立つでしょう。このプロジェクトはもともとiOS 5向けに書かれたものであり、それ以来テキストビューはあまり混乱していなかったかもしれません。

1
csga5000

これは、Interface Builderからもずっと発生します。

テキストビューを選択したら、[ユーティリティインスペクター]で[垂直インジケーターを表示]オプションをオフにします。切り取られたテキストが表示されます。

1

私は間違っているかもしれませんが、あなたの問題を完全に理解していませんが、UITextViewクラスでスクロール可能な複数行のテキスト領域の動作を実装しているため、UIScrollViewを使用するのは何ですか?

UIScrollViewは破棄する必要があります。

0
LudoZik

私は同じ状況に直面しています。 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];
}
0
Jagie

In Swift=私は単にtextContainerInsetUITextViewを設定することでこの問題を修正しました:

textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
                                           bottom: 50.0, right: 0.0)
0
NoodleOfDeath