ios - UITextView wird beim Laden nicht nach oben gescrollt




autolayout (6)

Wenn ich Text habe, der die UITextView nicht ausfüllt, wird der Bildlauf wie vorgesehen nach oben ausgeführt. Wenn mehr Text vorhanden ist, als auf den Bildschirm passt, wird die UITextView in die Mitte des Texts und nicht in den oberen Bereich verschoben.

Hier sind einige potenziell relevante Details:

In viewDidLoad können Sie den oberen und unteren Rand von UITextView auffüllen:

self.mainTextView.textContainerInset = UIEdgeInsetsMake(90, 0, 70, 0);

Das UITextView verwendet das automatische Layout, um es 20 Pixel von oben, unten und von jeder Seite des Bildschirms (in IB) zu verankern, um unterschiedliche Bildschirmgrößen und -ausrichtungen zu ermöglichen.

Ich kann es immer noch mit meinem Finger scrollen, sobald es geladen ist.

BEARBEITEN Ich habe festgestellt, dass das Entfernen der Einschränkungen für das automatische Layout und das anschließende Korrigieren der Breite das Problem nur für diese Bildschirmbreite zu beheben scheint.


Das Problem beim Einfügen von Code in viewDidLayoutSubviews und viewWillLayoutSubviews ist, dass diese Methoden häufig aufgerufen werden (während der Gerätedrehung, Ändern der Größe von Ansichten usw.). Wenn Sie etwas aus der Textansicht lesen und das Gerät drehen, wird der angezeigte Teil des Inhalts voraussichtlich weiterhin auf dem Bildschirm angezeigt. Sie erwarten nicht, dass der Bildlauf nach oben erfolgt. Versuchen Sie, anstatt den Inhalt nach oben zu scrollen, die scrollEnabled-Eigenschaft der Textansicht auf NO (false) zu setzen, und aktivieren Sie sie in viewDidAppear erneut.


Dies ist ein interessanter Fehler. In unserem Projekt tritt dies nur auf Geräten mit einem iPhone 5 Bildschirm auf. Es sieht so aus, als contentOffset sich das contentOffset der contentOffset zu einem bestimmten Zeitpunkt während des View-Controller-Lebenszyklus ändert. In viewDidLoad und viewWillAppear der contentOffset der contentOffset 0,0 und wird von viewDidAppear geändert. Sie können dies in viewWillLayoutSubviews . Einschränkungen scheinen korrekt eingerichtet zu sein.

Dadurch wird sichergestellt, dass Sie keine Bildlaufmethode aufrufen, es sei denn, dies wird benötigt:

if textView.contentOffset.y > 0 {
    textView.contentOffset = CGPoint(x: 0, y: 0)
    // Or use scrollRectToVisible, scrollRangeToVisible, etc.
}

Ich hatte das gleiche Problem! Auf vorgeschlagene Einschränkungen zurücksetzen und einfach setzen (y-Versatz)

@IBOutlet weak var textContent: UITextView!

    override func viewDidLoad() {
        textContent.scrollsToTop = true
        var contentHeight = textContent.contentSize.height
        var offSet = textContent.contentOffset.x
        var contentOffset = contentHeight - offSet
        textContent.contentOffset = CGPointMake(0, -contentOffset)
    }

UITextView ist eine Unterklasse von UIScrollView, sodass Sie deren Methoden verwenden können. Wenn Sie nur sicherstellen möchten, dass der Bildlauf nach oben erfolgt, versuchen Sie Folgendes, wo immer der Text hinzugefügt wird:

[self.mainTextView setContentOffset:CGPointZero animated:NO];

BEARBEITEN: AutoLayout mit jeder Art von Bildlauf wird schnell wackelig. Das Einstellen einer festen Breite löst es nicht überraschend. Wenn es in -viewDidLayoutSubviews nicht funktioniert, ist das seltsam. Das manuelle Festlegen einer Layoutbeschränkung funktioniert möglicherweise. Erstellen Sie zuerst die Einschränkungen in IB:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewWidthConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint;

dann im ViewController

    -(void)updateViewConstraints {
            self.textViewWidthConstraint.constant = self.view.frame.size.width - 40.0f;
            self.textViewHeightConstraint.constant = self.view.frame.size.height - 40.0f;
            [super updateViewConstraints];
        }

Möglicherweise ist das -viewDidLayoutSubviews von ContentOffset in -viewDidLayoutSubviews weiterhin erforderlich.

(Eine andere Methode wäre, eine Layoutbeschränkung für "'gleiche' Breiten" und "'gleiche' Höhen" zwischen der textView und ihrer superView mit einer Konstante von "-40" zu erstellen. Sie ist nur dann "gleich", wenn die Konstante Null ist Andernfalls wird es durch die Konstante angepasst. Da Sie diese Einschränkung jedoch nur einer Ansicht hinzufügen können, die beide Ansichten einschränkt, können Sie dies in IB nicht tun.)

Möglicherweise fragen Sie sich, wozu AutoLayout gut ist, wenn ich das tun muss? Ich habe mich intensiv mit AutoLayout beschäftigt, und das ist eine ausgezeichnete Frage.


Schnell

override func viewDidLoad() {
    super.viewDidLoad()  
    textView.isScrollEnabled = false  
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    textView.isScrollEnabled = true
}

Schnell

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

Ziel c

[self.textView scrollRangeToVisible:(NSMakeRange(0, 0))];




uitextview