Gibt es eine Möglichkeit, eine UIScrollView
automatische Anpassung an die Höhe (oder Breite) des Inhalts vorzunehmen , durch den gescrollt wird?
Etwas wie:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Gibt es eine Möglichkeit, eine UIScrollView
automatische Anpassung an die Höhe (oder Breite) des Inhalts vorzunehmen , durch den gescrollt wird?
Etwas wie:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Die beste Methode, die ich je gefunden habe, um die Inhaltsgröße von a UIScrollView
basierend auf den enthaltenen Unteransichten zu aktualisieren:
Ziel c
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
Schnell
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
viewDidLayoutSubviews
damit das Autolayout beendet wird. In iOS7 hat es gut funktioniert, aber das Testen des Autolayouts unter iOS6 hat die Arbeit aus irgendeinem Grund nicht beendet, sodass ich einige falsche Höhenwerte hatteviewDidAppear
. nur um darauf hinzuweisen, dass vielleicht jemand dies brauchen würde. dankeUIScrollView kennt die Höhe seines Inhalts nicht automatisch. Sie müssen die Höhe und Breite selbst berechnen
Mach es mit so etwas wie
Dies funktioniert jedoch nur, wenn die Ansichten untereinander liegen. Wenn Sie eine Ansicht nebeneinander haben, müssen Sie nur die Höhe einer Ansicht hinzufügen, wenn Sie den Inhalt des Scrollers nicht größer einstellen möchten, als er tatsächlich ist.
quelle
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Lösung, wenn Sie das automatische Layout verwenden:
Stellen Sie
translatesAutoresizingMaskIntoConstraints
aufNO
auf allen beteiligten Ansichten.Positionieren und skalieren Sie Ihre Bildlaufansicht mit Einschränkungen außerhalb der Bildlaufansicht.
Verwenden Sie Einschränkungen, um die Unteransichten in der Bildlaufansicht anzuordnen. Achten Sie dabei darauf, dass die Einschränkungen an alle vier Kanten der Bildlaufansicht gebunden sind und sich nicht auf die Bildlaufansicht verlassen, um ihre Größe zu ermitteln.
Quelle: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
quelle
Ich habe dies zu Espuz und JCCs Antwort hinzugefügt. Es verwendet die y-Position der Unteransichten und enthält keine Bildlaufleisten. Bearbeiten Verwendet den unteren Rand der untersten sichtbaren Unteransicht.
quelle
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
am Anfang undself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
am Ende der Methode gearbeitet?Hier ist die akzeptierte Antwort in Kürze für alle, die zu faul sind, um sie zu konvertieren :)
quelle
Hier ist eine Swift 3-Adaption von @ leviatans Antwort:
ERWEITERUNG
VERWENDUNG
Sehr einfach zu bedienen!
quelle
Die folgende Erweiterung wäre in Swift hilfreich .
Die Logik ist bei den gegebenen Antworten dieselbe. Es werden jedoch versteckte Ansichten darin weggelassen
UIScrollView
und die Berechnung wird durchgeführt, nachdem die Bildlaufindikatoren ausgeblendet wurden.Außerdem gibt es einen optionalen Funktionsparameter, und Sie können einen Versatzwert hinzufügen, indem Sie den Parameter an die Funktion übergeben.
quelle
Tolle und beste Lösung von @leviathan. Einfach mit dem FP-Ansatz (Functional Programming) schnell umsetzen.
quelle
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Sie können die Höhe des Inhalts in UIScrollView ermitteln, indem Sie berechnen, welches Kind "weiter kommt". Um dies zu berechnen, müssen Sie Herkunft Y (Start) und Artikelhöhe berücksichtigen.
Auf diese Weise müssen Elemente (Unteransichten) nicht direkt untereinander gestapelt werden.
quelle
Ich habe eine andere Lösung gefunden, die auf der Lösung von @ emenegro basiert
Grundsätzlich ermitteln wir, welches Element in der Ansicht am weitesten unten liegt, und fügen unten eine 10-Pixel-Polsterung hinzu
quelle
Da eine scrollView andere scrollViews oder einen anderen inDepth-SubViews-Baum haben kann, ist es vorzuziehen, die Tiefe rekursiv auszuführen.
Swift 2
Verwendung
quelle
Oder einfach:
(Diese Lösung wurde von mir als Kommentar auf dieser Seite hinzugefügt. Nachdem ich 19 Stimmen für diesen Kommentar erhalten habe, habe ich beschlossen, diese Lösung als formelle Antwort zum Nutzen der Community hinzuzufügen!)
quelle
Für swift4 mit reduzieren:
quelle
Die Größe hängt vom darin geladenen Inhalt und den Beschneidungsoptionen ab. Wenn es sich um eine Textansicht handelt, hängt dies auch vom Umbruch, der Anzahl der Textzeilen, der Schriftgröße usw. ab. Fast unmöglich für Sie, sich selbst zu berechnen. Die gute Nachricht ist, dass sie nach dem Laden der Ansicht und in viewWillAppear berechnet wird. Vorher ist alles unbekannt und die Inhaltsgröße entspricht der Frame-Größe. In der viewWillAppear-Methode und danach (z. B. viewDidAppear) ist die Inhaltsgröße jedoch die tatsächliche.
quelle
Um den Code von Richy zu verpacken Ich habe eine benutzerdefinierte UIScrollView-Klasse erstellt, die die Größenänderung von Inhalten vollständig automatisiert!
SBScrollView.h
SBScrollView.m:
Verwendung:
Importieren Sie einfach die .h-Datei in Ihren View Controller und deklarieren Sie eine SBScrollView-Instanz anstelle der normalen UIScrollView-Instanz.
quelle
Stellen Sie die Größe des dynamischen Inhalts wie folgt ein.
quelle
es hängt wirklich vom Inhalt ab: content.frame.height könnte Ihnen geben, was Sie wollen? Kommt darauf an, ob Inhalt eine einzelne Sache oder eine Sammlung von Dingen ist.
quelle
Ich fand auch Leviathans Antwort, um am besten zu funktionieren. Es wurde jedoch eine seltsame Höhe berechnet. Wenn beim Durchlaufen der Unteransichten die Bildlaufansicht so eingestellt ist, dass Bildlaufindikatoren angezeigt werden, befinden sich diese im Array der Unteransichten. In diesem Fall besteht die Lösung darin, die Bildlaufanzeigen vor dem Schleifen vorübergehend zu deaktivieren und dann ihre vorherige Sichtbarkeitseinstellung wiederherzustellen.
-(void)adjustContentSizeToFit
ist eine öffentliche Methode für eine benutzerdefinierte Unterklasse von UIScrollView.quelle
Ich denke, dies kann eine gute Möglichkeit sein, die Größe der Inhaltsansicht von UIScrollView zu aktualisieren.
quelle
warum nicht einzelne Codezeile?
quelle
quelle