2017-01-04 7 views
2

私はPage Viewのモーダル画面を持っています。 Page Viewは、ストーリーボードIDを使用してページを読み込みます。すべてのページが同じです。各ページには、テキストとスクロール可能なUITextViewがあります。 viewDidLoadにテキストが設定されます。テキストが設定されると自動的に下にスクロールしますのでviewDidAppear[self.textField setContentOffset:CGPointZero animated:animated];を呼び出します。UITextViewが先頭から始まらない

これは最初のページを除いて問題なく動作します。 bugのため、viewDidLayoutSubviewsUITextViewの場合はscrollEnabledをトグルする必要があります。しかし、最初のページがロードされるときには、の前に何らかの理由でviewDidAppearが呼び出されます。これはおそらく、トグルのためにUITextViewをスクロールするという副作用があります。最初のページをスクロールして最初のページに戻ると、期待通りに機能します(呼び出し元の順序は他のページと同じです)。 viewDidLoadでメインキューにasync_dispatch内のテキストを設定する

  • 私が試したいくつかの他の事。

  • scrollRangeToVisiblesetContentOffsetviewDidLayoutSubviews
  • 種々の組合せで[self.textField scrollRangeToVisible:NSMakeRange(0, 0)];を呼び出します。
  • self.automaticallyAdjustsScrollViewInsets = NO;viewDidLoadに設定します。
  • 誰もがこの問題を解決する方法についてのアイデアを持って

(上記の方法のいずれかを使用して)テキストを設定した後、ビューをスクロールしようとすると?ここで

は、ビューコントローラのためのコードです:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Get help string 
    NSMutableAttributedString *attributedString = <fetch text from external source> 

    // Set text 
    self.textField.attributedText = attributedString; 
} 

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

- (void)viewDidLayoutSubviews { 

    [super viewDidLayoutSubviews]; 

    self.textField.scrollEnabled = NO; 
    self.textField.scrollEnabled = YES; 
} 
+0

'viewWillAppear:'何かが画面上に現れる前の最後の分の調整を行うのに適した場所は通常、私は、これはあなたが – Alex

+0

その良い推測で探しているものだと思いますが、この場合 'viewDidLayoutSubviews' 'viewWillAppear'の後に呼び出され、強制スクロールはレイアウトの後に行わなければなりません(何らかの理由でレイアウトコールバックにはありません)。 'viewDidLayoutSubviews'の後に' viewDidAppear'が呼び出されます。 –

+0

あなたの質問のタイトルは 'UITextView'と言っていますが、あなたはあなたの質問で' UITextField'を繰り返し参照しています:それは? – Alex

答えて

0

これは私のために動作します。 UIViewControllerUITextViewをロードしています。私はviewDidLoadにテキストを割り当て、にcontentOffsetを設定します。

class ViewController: UIViewController { 
    @IBOutlet weak var textView: UITextView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     textView.text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda." 
    } 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     textView.contentOffset = .zero 
    } 
} 
+0

'viewDidLoad'で' scrollEnabled'をオンとオフに切り替えると、これは機能しますか? –

+0

はい。あなたがまだ問題を抱えている場合は、コントローラを提示する方法やテキストを読み込む方法のコードを追加することもできます。 – Alex

関連する問題