UITextView-Text wird unsichtbar, sobald die Höhe 8192.0 erreicht

9

Ich habe ein nicht scrollbares UITextView in ein UIScrollView eingebettet und füge dem UITextView dynamisch Text hinzu. Die UIScrollView passt ihre contentSize basierend auf dem Frame des TextView entsprechend an. Sobald der UITextView jedoch eine Höhe von 8192 überschreitet, wird der Text unsichtbar (aber immer noch dort, weil Sie mit der Lupe Text hervorheben und sogar Teile des Textes durch die Lupe sehen können).

%Vor%

Hilfefunktion, um UITextView entsprechend anzupassen:

%Vor%

Hatte nicht bemerkt, dass es genau das gleiche Problem war, das hier ungelöst war, bis ich es getestet habe explizit durch Erzwingen der maximalen Größe auf 8193 und das Problem trat auf (während eine maximale Größe von 8192 immer noch den Text korrekt angezeigt hat). Wer ist schon mal auf dieses Problem gestoßen und kennt eine Arbeit? Danke

    
SimplyLearning 10.05.2014, 14:52
quelle

3 Antworten

3

Ich wurde kürzlich von diesem Problem getroffen und habe einen effektiven Weg gefunden. Obwohl es scheint wie ein iOS-Bug IMHO ist es wirklich nicht ... es gibt praktische Grenzen für CALayer Größen, und das Zeichnen eines 8K hohen Stücks Text braucht eine lange Zeit. Viel besser zu tun, als Apple es beabsichtigt hat und nur das sichtbare Bit darzustellen ... darum erweitert UITextView UIScrollView schließlich.

Das Problem ist, dass UITextView nicht besonders einfach mit anderen UI-Elementen zu integrieren ist. In meinem Fall arbeite ich an einer Nachrichten-App, wo ein einzelner UITextView verwendet wird, um den Artikel zu rendern. Außerdem gibt es oben und unten eine separate UI (Titel und Schaltflächen usw.), die alle in einem einzigen scrollbaren Container gespeichert sind.

Die Lösung, die ich gefunden habe, besteht darin, das UITextView in zwei Ansichten aufzuteilen ... einen dedizierten UITextView-Container, dessen Frame die Volltextgröße (d. h. die gleiche Größe wie die contentSize von UITextView) und die Superview von UITextView ist. Der Rahmen Ihres untergeordneten UITextView sollte auf die Grenzen des äußeren scrollbaren Containers festgelegt werden.

Dann müssen Sie nur die Schlüsselwertbeobachtung verwenden, um die contentOffset-Eigenschaft Ihrer äußeren scrollbaren Containeransicht zu überwachen (in meinem Fall ist dies eine UICollectionView). Wenn sich contentOffset ändert, aktualisieren Sie (1) das contentOffset Ihrer UITextView und (2) die transform-Eigenschaft der UITextView-Ebene. Durch das Aktualisieren dieser Transform-Eigenschaft wird die UITextView behoben, um den aktuell sichtbaren Teil ihrer Superview zu füllen. Da Sie aber auch das contentOffset der UITextView aktualisieren, ist diese Trickserei für den Benutzer völlig unsichtbar ... es sieht so aus und verhält sich so, als wäre die UITextView einfach sehr groß.

    
Reuben Scratton 13.07.2014 18:53
quelle
1

Hier ist eine voll funktionsfähige Lösung für alle, die es mögen!

** Angenommen, Ihre Inhaltsgröße überschreitet nicht die Grenzen von zwei Textansichten **

Diese Lösung funktioniert, indem Sie Ihrer Ansicht zwei UITextViews hinzufügen und Ihren Text aufteilen. Es sieht kompliziert aus, aber es ist eigentlich sehr einfach! Ich habe gerade eine sehr ausführliche Beschreibung geschrieben:)

Schritt 1 - Fügen Sie Ihrer Ansicht zwei UITextViews hinzu:

Ich habe meinen in meinem Storyboard hinzugefügt. Platziere sie so, dass das eine direkt über dem anderen ist und dass kein Zwischenraum zwischen ihnen ist. Mach dir keine Sorgen über die Höhe (wir werden das später einstellen).

Legen Sie Beschränkungen für die Ansichten fest, sodass sie von oben und unten und die umgebenden Kanten des Containers von allen anderen Seiten einschließlich der gewünschten Auffüllung miteinander verbunden sind. d. h. bindet die erste Textansicht vom oberen, linken und rechten Rand an den Container und von unten an die zweite Textansicht an. Verknüpfen Sie die zweite Textansicht mit dem Container von unten, links und rechts und mit der ersten Textansicht von oben. Dadurch wird sichergestellt, dass sie bei der Einstellung des Inhalts angemessen gedehnt werden.

Legen Sie keine Einschränkungen für die Höhe der Ansichten fest, oder stellen Sie die Höhe einer der Ansichten auf >= 20 oder eine ähnlich kleine Zahl ein, um Warnungen vom Construction Inspector zu vermeiden.

Deaktivieren Sie Scroll-, Bounce- und Scroll-Indikatoren für beide Textansichten. Diese Lösung basiert darauf, dass es sich bei den Ansichten um eine feste, nicht scrollbare Höhe handelt. Wenn Sie also Ihren Inhalt scrollen möchten, sollten Sie ein UIScrollView- oder UITableViewCell-Objekt als Container verwenden.

Erstellen Sie Outlets für Ihre zwei neuen Textansichten in Ihrer View-Controller-Datei und nennen Sie sie so wie textView1 und textView2 .

Schritt 2 - Setzen Sie textContainerInsets auf null:

Setzen Sie die textContainerInset-Eigenschaft für beide Textansichten auf Null, entweder mit benutzerdefinierten Laufzeitattributen:

oder Code:

%Vor%

Dadurch wird sichergestellt, dass der nicht sichtbare Bereich zwischen den beiden Ansichten angezeigt wird, wenn der Inhalt festgelegt ist, und dass der Abstand zwischen den Ansichten nicht beeinträchtigt wird.

Schritt 3 - Teilen Sie Ihre Inhalte auf, legen Sie sie fest und aktualisieren Sie die Ansichtshöhen:

Kopieren Sie einfach den folgenden Code in Ihre View-Controller-Datei ( viewDidLoad ) und setzen Sie die Variable contentString auf Ihren Inhalt.

%Vor%

Dieser Code teilt den ContentString ungefähr in der Mitte auf und sucht nach dem nächsten Zeilenumbruch. Wenn Sie Ihren Inhalt auf ein anderes Zeichen aufteilen möchten, ändern Sie einfach alle Vorkommen von \n oben auf das, was Sie teilen möchten.

Schritt 4 - Legen Sie die Höhe der Containeransicht fest:

Legen Sie Ihre Containeransicht (scrollView, tableViewCell, was auch immer) auf die Höhe Ihrer beiden Textansichten fest, plus zusätzlichen Platz, den Sie darüber und darunter gesetzt haben.

%Vor%

(In meinem Code ist kTextViewContainerPadding ein Makro, das ich auf die Summe des Raums oberhalb und unterhalb meiner beiden Textansichten in seinem Container gesetzt habe.)

Das ist es! Viel Glück.

    
Fateh Khalsa 10.05.2016 19:40
quelle
-4

Hallo, ich glaube nicht zu spät zu antworten. Ich habe das gleiche Problem wie du. Das ist meine Lösung:

%Vor%

Ich habe das Problem gelöst und ich kann die Größe dynamic.Successfull auf iOS 8

ändern     
fltx 27.06.2015 14:43
quelle

Tags und Links