web-dev-qa-db-ja.com

UITextViewのテキストコンテンツは上から始まりません

JSONファイルからの長いテキストがありますが、UITableViewCellからリンクをクリックしてUIViewControllerページに移動すると、UITextViewテキストに文字列コンテンツが読み込まれますが、最初からコンテンツが表示されず、すべて上にスクロールする必要があります時間。

私は何をする必要がありますか?

76
Ornilo

私は同じ問題を抱えていましたが、それを有効にするにはviewDidLayoutSubviewsでコンテンツオフセットを設定する必要がありました。このコードを使用して、属性付きの静的テキストを表示しています。

- (void)viewDidLayoutSubviews {
    [self.yourTextView setContentOffset:CGPointZero animated:NO];
}

スウィフト3:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
151
iosjillian

これは私のために働いた唯一の方法です。ビューがロードされる前にITextViewのスクロールを無効にしてから、再度有効にします:

  override func viewWillAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = false
    }

    override func viewDidAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = true
    }
42
Danny182
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];

viewDidLoad

27
Liuk Smith

コンテンツをロードする前にプログラムで、textview textview.scrollenabled = NO;のスクロールプロパティを無効にします。

そして読み込み後、textview textview.scrollenabled = YES;のスクロールを有効にします

同様にXIBをチェックし、Textviewの有効なスクロールを常にオフにします。

18
appsign

質問に対する回答 iOS 10のUITextViewの上部の空白 は、エンドユーザーエクスペリエンスをよりクリーンにします。

テキストビューを含むView ControllerのviewDidLoadで:

 self.automaticallyAdjustsScrollViewInsets = false

textView.setContentOffset(CGPointMake(0,0), animated: false)およびこれらのその他の提案の設定は、viewDidLayoutSubviews()で呼び出されたときに機能しますが、iPad 2以前のような古いデバイスでは、画面が表示されるときに実際にテキストがスクロールされます。これは、エンドユーザーに見せたいものではありません。

12
Glenn

これらのソリューションを使用した後も、まだ問題がありました。この問題は、透明なナビゲーションバーを使用し、View Controllerのコンテンツインセットを自動的に調整することに関連しているようです。ナビゲーションバーの下でのテキストのスクロールを気にしない場合は、これらの設定をオフにして、ビュービューの上部ではなく、ナビゲーションバーの下部にテキストビューの上部を制限するのが最善です。

私のように、下にスクロールしたときにナビゲーションバーの下に表示されるようにしたい場合は、それから私のために働いた解決策はこれを追加することでした.

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height;

    [self.textView setContentOffset:CGPointMake(0, -offset) animated:NO];
}

これは、ナビゲーションバーとステータスバーの高さを検索し、それに応じてコンテンツオフセットを調整します。

このアプローチの欠点の1つは、デバイスが回転すると、最後までスクロールしてしまうことに注意してください。

4
Mark Bridges

他の回答と似ていますが、以降のデバイスの回転でスクロールが上にならないという追加の利点があります。 Swift 2.2でうまく機能します

/// Whether view has laid out subviews at least once before.
var viewDidLayoutSubviewsAtLeastOnce = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if !viewDidLayoutSubviewsAtLeastOnce {
        textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false)
    }

    viewDidLayoutSubviewsAtLeastOnce = true
}
4
danbretl

私にとっては、このコードはうまく機能します:

    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64 //or = 0 if no Navigation Bar
    textView.scrollEnabled = false
    textView.layoutIfNeeded()
    textView.scrollEnabled = true

正確な位置にスクロールして画面の上部に表示するには、次のコードを使用します。

    var scrollToLocation = 50 //<needed position>
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))

ContentOffset.yを設定すると、テキストの最後までスクロールし、scrollRangeToVisibleがscrollToLocationの値までスクロールします。これにより、必要な位置がscrollViewの最初の行に表示されます。

4
Igor

Swiftバージョン

物事の組み合わせが必要になります。

1.)コンセントを設定する

  @IBOutlet var textView: UITextView!

2.)View Controllerのストーリーボードで「スクロールビューインセットの調整」をオフにします

3.)View Controllerに以下を追加して、コンテンツをゼロトップに設定します

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews()
     myUITextView.setContentOffset(CGPointZero, animated: false)
}
3
kelsheikh

viewDidLayoutSubviewsからコンテンツオフセットを設定する代わりに、layoutIfNeeded from viewDidLoadを記述して、textviewの適切な位置を以下のように設定できます。

    self.textView.layoutIfNeeded()
    self.textView.setContentOffset(CGPoint.zero, animated: false)

乾杯!!

3
Dhaval H. Nena

これは私にとって最高の仕事でした!これをviewDidLoad()内に配置しました。

//TextView Scroll starts from the top
myTextView.contentOffset.y = 0
2
Warren

Swift 3.0

override func viewWillAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = true
}
2
MRustamzade

Swift 2、Xcode 7のソリューションでは、スクロール有効を残し、テキストを先頭から開始するには、これで十分です。

@IBOutlet weak var myUITextView: UITextView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //start scroll at top of text
    myUITextView.scrollRangeToVisible(NSMakeRange(0, 0))
}
2
Brian Ogden

解決する手順

  • UITextViewスクロールビューを無効にします
  • scrollRectToVisibleを有効にする
  • UITextViewスクロール

スウィフト3:

self.yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
self.yourTextView.scrollRectToVisible(rect, animated: false)
self.yourTextView.isScrollEnabled = true

これは私のために働いた。

1
Mohit Kumar

Swiftバージョン:

override func viewDidLayoutSubviews() {
    yourTextView.setContentOffset(CGPointZero, animated: false)
}
1
Rashwan L

Swift 4の属性付きテキストでは、いずれの回答も役に立たず、トピックでいくつかの回答を組み合わせています。

override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
     uiTextview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
     uiTextview.isScrollEnabled = true
     uiTextview.setContentOffset(CGPoint.zero, animated: false)
}
1
hall.keskin

これは、私にとって常に有効な別の方法です。 Objective-C:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.textView setContentOffset:CGPointZero animated:NO];
}

そして、Swiftでは:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    textView.setContentOffset(CGPointZero, animated: false)
}
1
Swindler

次の関数をView Controllerクラスに追加します...

Swift 3

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(.zero, animated: false)
}
Swift 2.1

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Objective C

- (void)viewDidLayoutSubviews {
    [self.mainTextView setContentOffset:CGPointZero animated:NO];
}

または、ViewDidAppearのセクションで上に移動すると、このように他のユーザーが最初に実行されるのを見ることができます。

1
myj

クラスにこのコードを配置

override func viewDidLayoutSubviews() {
        self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
    }
0
Nimisha joshy

これは私がやった方法です。私はtextviewをサブクラス化し、そして:

override func willMoveToSuperview(newSuperview: UIView?) {
    self.scrollEnabled = false
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.scrollEnabled = true
}
0

ストーリーボードから、テキストビューを配置したView Controllerを選択します。属性インスペクターで、「スクロールビューのインセットを調整」のチェックを外します。それでおしまい。

0
Aftab Baig