私はすぐにそれを取得します。 UItextView
をビューに配置し、スクロールしてすべてのテキストを表示する必要がある場合(textViewに多くのテキストが存在する場合)、textViewはテキストの途中から開始し、テキストを他の時間。
TextViewでは編集は有効になっていません。毎回、textViewを強制的に先頭から開始する方法が必要です。他の人がコンテンツオフセットを使用している場合、このような質問を見ましたが、それがどのように機能するのか、またはここで適用できるのかさえわかりません。
ご協力いただきありがとうございます。
それは私のためにトリックをしました!
[self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
このオーバーライドメソッドをViewControllerに追加します
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPointZero, animated: false)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.contentOffset = .zero
}
上記のすべての答えは私にとってうまくいきませんでした。ただし、秘密は、次のようにviewDidLayoutSubviewsのオーバーライド内でソリューションを実装することです。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
welcomeText.contentOffset = .zero
}
HTH :)
In Swift 2
これを使用して、textViewを先頭から開始できます。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myTextView.setContentOffset(CGPointZero, animated: false)
}
Swift 2でXcode 7.2での動作を確認
以下のコードを試してください-
if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
self.automaticallyAdjustsScrollViewInsets = NO;
}
または、StoryBoardでこのプロパティを設定することもできます-
ViewControllerを選択してから、属性インスペクターを選択します(チェックを外しますAdjust Scroll View Insets
。
Swift> 2.2、上記の方法を使用してiOS 8およびiOS 9で問題が発生しました。単一の答えが機能しないため、ここで両方で機能するようにしました。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if #available(iOS 9.0, *) {
textView.scrollEnabled = false
}
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if #available(iOS 9.0, *) {
textView.scrollEnabled = true
}
}
UINavigationBarのtranslucent
プロパティをNO
に更新します。
self.navigationController.navigationBar.translucent = NO;
これにより、ビューがナビゲーションバーとステータスバーの下に表示されなくなります。
ナビゲーションバーを表示および非表示にする必要がある場合は、viewDidLoad
で以下のコードを使用します
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
お役に立てれば。
多くのテストで、最初からUITextViewが表示されることを確認するために、viewWillLayoutSubviews()関数に以下を追加する必要があります。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0))
}
Xcode 7.2 7c68; IOS 9.1
ViewController
を含むUITextView
は複雑で、プロジェクト中に大きく変更されました(IDEバージョンも2〜3回変更されました)。
上記のすべての解決策を試しましたが、同じ問題が発生した場合は、[〜#〜] patient [〜#〜]にしてください。
解決すべき3つの「秘密コード」があります。
textView.scrollEnabled = false //then set text textView.scrollEnabled = true
_textView.scrollRangeToVisible(NSMakeRange(0, 0))
textView.setContentOffset(CGPointZero, animated: false)
また、これらのコードを配置できる場所は2つあります。
viewDidLoad()
viewDidLayoutSubviews()
それらを組み合わせると、3 * 2 = 6のソリューションが得られます。正しい組み合わせは、ViewController
がどれだけ複雑かによって異なります(信じてください。textView
の上のビューだけを削除した後、新しい組み合わせ)。
そして、私はそれを見つけました:
viewDidLayoutSubviews()
に「シークレットコード」を配置し、viewDidLoad()
に_textView.text = someStrings
_を配置すると、textView
のコンテンツが時々「揺れ」ます。したがって、それらを同じ場所に置きます。
最後の言葉:[〜#〜] all [〜#〜]の組み合わせを試してください。これが、この愚かなバグを2か月間に3回以上解決する方法です。
この1行のコードをViewDidLoadに配置します
self.automaticallyAdjustsScrollViewInsets = false
UITextView
スクロールは多くの人にとって問題のようです。ここの答え(特に this )とApple開発者ドキュメント、私自身のウィットのいくつかを使用して、ここに私のために働く解決策があります。ニーズに合わせてコードを変更します。
私の使用例は次のとおりです。同じUITextView
がさまざまな目的に使用され、さまざまな状況でさまざまなコンテンツを表示します。私が欲しいのは、コンテンツが変更されると、古いスクロール位置が復元されるか、最後までスクロールされることです。これが完了したら、あまりアニメーションを望んでいません。特に、すべてのテキストが新しいようにビューをアニメートしたくありません。このソリューションでは、最初にアニメーションなしで古いスクロール位置を復元し、必要に応じてアニメーションの最後までスクロールします。
あなたがする必要がある(またはcanと言う必要があります)は、次のようにUITextViewを拡張します:
extension UITextView {
func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) {
self.text = text
let delayInSeconds = 0.001
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.setContentOffset(storedOffset, animated: false)
if scrollToEnd && !text.isEmpty {
let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0))
})
}
})
}
}
これは、テキストを更新し、保存されたUITextView.contentOffset
プロパティ(またはパラメーターとして渡すもの)、およびそれに応じてビューのオフセットを設定します。必要に応じて、その後、潜在的に変更された新しいコンテンツの最後までスクロールします。
私はiOSプログラミングに慣れていないので、なぜそれがうまく機能するのかわかりません。誰かがこれについて何らかの情報を持っているなら、知っておくといいでしょう。また、このアプローチは完璧ではないかもしれないので、改善のアイデアも受け入れています。
そしてもちろん、上記のリンクの後ろに答えを投稿してくれた NixonsBack に感謝します。
私の最初の投稿:)、乾杯!
次のコードは、あなたが望む効果を与えるはずです。
[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
「self.scrollView」をスクロールビューの名前に置き換える必要があります。スクロールビューのテキストを設定した後、このコードを配置する必要があります。
これは私のために働いた:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
textView.scrollRectToVisible(CGRect(Origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false)
}
これはXcode 8.3.3でうまくいきました。
-(void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
[self.txtQuestion scrollRangeToVisible:NSMakeRange(0, 0)];
}
ViewController.Swift
ファイルにUITextView
のアウトレットを作成します。 ViewDidLoad
セクションに次を入力します。
迅速:
self.textView.contentOffset.y = 0
私が試してみました:
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
Zeepleの回答をMonoTouch/Xamarin(C#)に翻訳しました。
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false);
}
ビューを希望どおりに機能させるには、ここに2つの答えを実装する必要がありました。
Juan David Cruz Serranoから:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPoint.zero, animated: false)
}
Murat Yasarから:
automaticallyAdjustsScrollViewInsets = false
これにより、一番上にスクロールがロードされ、スクロールが開始されるとインセットが変更されないUITextViewが提供されました。これがデフォルトの動作ではないことは非常に奇妙です。
Swift 4.2&Swift 5
テキストを設定する前後にコンテンツオフセットを設定します。 (メインスレッド上)
let animation = false //or whatever you want
self.mainTextView.setContentOffset(.zero, animated: animation)
self.mainTextView.attributedText = YOUR_ATTRIBUTED_TEXT
self.mainTextView.setContentOffset(.zero, animated: animation)
textView
を毎回強制的に先頭から開始するには、次のコードを使用します。
Swift 4.2
:
override func viewDidLayoutSubviews() {
textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}
Objective-C
:
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}