JSONファイルからの長いテキストがありますが、UITableViewCellからリンクをクリックしてUIViewControllerページに移動すると、UITextViewテキストに文字列コンテンツが読み込まれますが、最初からコンテンツが表示されず、すべて上にスクロールする必要があります時間。
私は何をする必要がありますか?
私は同じ問題を抱えていましたが、それを有効にするにはviewDidLayoutSubviewsでコンテンツオフセットを設定する必要がありました。このコードを使用して、属性付きの静的テキストを表示しています。
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}
スウィフト3:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.textView.setContentOffset(CGPoint.zero, animated: false)
}
これは私のために働いた唯一の方法です。ビューがロードされる前にITextViewのスクロールを無効にしてから、再度有効にします:
override func viewWillAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = true
}
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];
viewDidLoad
に
コンテンツをロードする前にプログラムで、textview textview.scrollenabled = NO;
のスクロールプロパティを無効にします。
そして読み込み後、textview textview.scrollenabled = YES;
のスクロールを有効にします
同様にXIB
をチェックし、Textviewの有効なスクロールを常にオフにします。
質問に対する回答 iOS 10のUITextViewの上部の空白 は、エンドユーザーエクスペリエンスをよりクリーンにします。
テキストビューを含むView ControllerのviewDidLoad
で:
self.automaticallyAdjustsScrollViewInsets = false
textView.setContentOffset(CGPointMake(0,0), animated: false)
およびこれらのその他の提案の設定は、viewDidLayoutSubviews()
で呼び出されたときに機能しますが、iPad 2以前のような古いデバイスでは、画面が表示されるときに実際にテキストがスクロールされます。これは、エンドユーザーに見せたいものではありません。
これらのソリューションを使用した後も、まだ問題がありました。この問題は、透明なナビゲーションバーを使用し、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つは、デバイスが回転すると、最後までスクロールしてしまうことに注意してください。
他の回答と似ていますが、以降のデバイスの回転でスクロールが上にならないという追加の利点があります。 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
}
私にとっては、このコードはうまく機能します:
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の最初の行に表示されます。
Swiftバージョン
物事の組み合わせが必要になります。
1.)コンセントを設定する
@IBOutlet var textView: UITextView!
2.)View Controllerのストーリーボードで「スクロールビューインセットの調整」をオフにします
3.)View Controllerに以下を追加して、コンテンツをゼロトップに設定します
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
myUITextView.setContentOffset(CGPointZero, animated: false)
}
viewDidLayoutSubviewsからコンテンツオフセットを設定する代わりに、layoutIfNeeded from viewDidLoadを記述して、textviewの適切な位置を以下のように設定できます。
self.textView.layoutIfNeeded()
self.textView.setContentOffset(CGPoint.zero, animated: false)
乾杯!!
これは私にとって最高の仕事でした!これをviewDidLoad()内に配置しました。
//TextView Scroll starts from the top
myTextView.contentOffset.y = 0
Swift 3.0
override func viewWillAppear(_ animated: Bool) {
privacyText.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
privacyText.isScrollEnabled = true
}
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))
}
解決する手順
スウィフト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
これは私のために働いた。
Swiftバージョン:
override func viewDidLayoutSubviews() {
yourTextView.setContentOffset(CGPointZero, animated: false)
}
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)
}
これは、私にとって常に有効な別の方法です。 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)
}
次の関数を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のセクションで上に移動すると、このように他のユーザーが最初に実行されるのを見ることができます。
クラスにこのコードを配置
override func viewDidLayoutSubviews() {
self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
}
これは私がやった方法です。私はtextviewをサブクラス化し、そして:
override func willMoveToSuperview(newSuperview: UIView?) {
self.scrollEnabled = false
}
override func layoutSubviews() {
super.layoutSubviews()
self.scrollEnabled = true
}
ストーリーボードから、テキストビューを配置したView Controllerを選択します。属性インスペクターで、「スクロールビューのインセットを調整」のチェックを外します。それでおしまい。