Wozu dient die UIScrollView contentInset-Eigenschaft?

158

Kann mir jemand erklären, wofür die contentInset-Eigenschaft in einer UIScrollViewInstanz verwendet wird? Und vielleicht ein Beispiel geben?

ForeignerBR
quelle

Antworten:

239

Hiermit wird der Abstand des Einschubs zwischen der Inhaltsansicht und der umschließenden Bildlaufansicht festgelegt.

Obj-C

aScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0);

Swift 5.0

aScrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 7.0)

Hier ist ein guter Artikel der iOS-Referenzbibliothek zu Bildlaufansichten mit einem informativen Screenshot (Abb. 1-3). Ich werde ihn hier per Text replizieren:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑


   (cH = contentSize.height; cW = contentSize.width)

Die Bildlaufansicht enthält die Inhaltsansicht sowie alle Auffüllungen, die von den angegebenen Inhaltseinfügungen bereitgestellt werden.

jball
quelle
Wird es dann verwendet, um der UIScrollView eine Auffüllung hinzuzufügen? Wenn nicht, könnten Sie mir ein praktisches Beispiel geben. Mein Problem ist nicht, wie man es implementiert, sondern wann man es implementiert.
ForeignerBR
28
Ja, der Inhalt wird auf der Innenseite der Bildlaufansicht aufgefüllt. Es ähnelt der CSS- paddingEigenschaft.
Marc W
Es tut mir leid, dass ich dies huckepack nehmen muss. Ich kann seine eigene Frage verschieben. Was passiert dann tatsächlich, wenn Sie jeden contentInset-Wert auf 0 setzen, außer zum Beispiel contentHeight? Erzwingt dies, dass die gesamte Bildlaufansicht der Höhe entspricht, auf die Sie sie eingestellt haben?
Jakev
@jakev Nein, die .frame-Eigenschaft steuert die Abmessungen der Bildlaufansicht innerhalb des übergeordneten Elements (siehe diese Antwort: stackoverflow.com/questions/5361369/… ). Wenn Sie die contentInsets für alle Seiten auf 0 setzen, wird der Inhalt in der Bildlaufansicht überhaupt nicht aufgefüllt. Wenn Sie also nach oben scrollen, befindet sich der Inhalt direkt am oberen Rand der Bildlaufansicht. Wenn Sie nach unten scrollen, reicht der Inhalt bis zum Ende der Bildlaufansicht.
Jeremy Wiebe
ist es möglich, contentInset immer beizubehalten, auch wenn beim Scrollen immer marin an der Spitze (contenInset) von scrollView
Chlebta
86

Die Antwort von jball ist zwar eine hervorragende Beschreibung der Inhaltseinfügungen, beantwortet jedoch nicht die Frage, wann sie verwendet werden soll. Ich werde aus seinen Diagrammen ausleihen:

  _|←_cW_→_|_↓_
   |       | 
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
   |content|    
-------------↑-

Das bekommen Sie, wenn Sie es tun, aber die Nützlichkeit zeigt sich nur, wenn Sie scrollen:

  _|←_cW_→_|_↓_
   |content| ← content is still visible
---------------
   |content| ↑
 ↑ |content| contentInset.top
cH |content|
 ↓ |content| contentInset.bottom
   |content| ↓
---------------
  _|_______|___ 
             ↑

Diese obere Inhaltszeile ist weiterhin sichtbar, da sie sich noch im Rahmen der Bildlaufansicht befindet. Eine Möglichkeit, sich den oberen Versatz vorzustellen, besteht darin, "wie stark der Inhalt in der Bildlaufansicht nach unten verschoben werden muss, wenn wir ganz nach oben gescrollt haben".

Um einen Ort zu sehen, an dem dies tatsächlich verwendet wird, schauen Sie sich die integrierte Foto-App auf dem iPhone an. Die Navigationsleiste und die Statusleiste sind transparent und der Inhalt der Bildlaufansicht ist darunter sichtbar. Das liegt daran, dass sich der Rahmen der Bildlaufansicht so weit erstreckt. Ohne den eingefügten Inhalt wäre es jedoch niemals möglich, den oberen Rand des Inhalts durch diese transparente Navigationsleiste freizugeben, wenn Sie ganz nach oben gehen.

Fabian
quelle
Das Schöne daran ist, dass Sie die Einfügungen verwenden können, um den Effekt "Bildlauf unter Statusleiste mit Unschärfe" zu erstellen.
TheEye
Beispiel über Fotos App war leicht zu verstehen.
Abhimuralidharan
8

Inhaltseinfügungen lösen das Problem, dass Inhalte unter anderen Teilen der Benutzeroberfläche angezeigt werden und dennoch über Bildlaufleisten erreichbar bleiben. Mit anderen Worten, der Zweck des Inhaltseinsatzes besteht darin, den Interaktionsbereich kleiner als seinen tatsächlichen Bereich zu machen.

Stellen Sie sich den Fall vor, in dem wir drei logische Bereiche des Bildschirms haben:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

und wir möchten, dass der TEXT niemals transparent unter den TOP-TASTEN angezeigt wird, aber wir möchten, dass der Text unter der UNTEREN TAB-BAR angezeigt wird und dennoch das Scrollen ermöglicht, damit wir den Text unter der UNTEN-TAB-BAR transparent aktualisieren können.

Dann würden wir den oberen Ursprung so einstellen, dass er unter den TOP-TASTEN liegt, und die Höhe so, dass sie den unteren Rand der UNTEREN TAB-BAR einschließt. Um Zugriff auf den Text zu erhalten, der sich unter dem Inhalt der BOTTOM TAB BAR befindet, setzen wir den unteren Einschub auf die Höhe der BOTTOM TAB BAR.

Ohne den Einschub würde der Scroller nicht zulassen, dass Sie den Inhalt so weit nach oben scrollen, dass Sie ihn eingeben können. Mit dem Einschub ist es so, als hätte der Inhalt einen zusätzlichen "LEEREN INHALT" in der Größe des Inhaltseinsatzes. Leerer Text wurde in den eigentlichen "Inhalt" "eingefügt" - so erinnere ich mich an das Konzept.

Faisal Memon
quelle
4

Es wird verwendet, um Polster hinzuzufügen UIScrollView

Ohne contentInsetist eine Tabellenansicht wie folgt:

Geben Sie hier die Bildbeschreibung ein

Dann setzen Sie contentInset:

tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Der Effekt ist wie folgt:

Geben Sie hier die Bildbeschreibung ein

Scheint besser zu sein, oder?

Und ich schreibe einen Blog , um das zu studieren contentInset, Kritik ist willkommen.

fujianjin6471
quelle
2

Gute Frage.

Betrachten Sie das folgende Beispiel ( scrollerist eine UIScrollView):

float offset = 1000;
[super viewDidLoad];
for (int i=0;i<500; i++) {
    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(i * 100, 50, 95, 100)] autorelease];
    [label setText:[NSString stringWithFormat:@"label %d",i]];
    [self.scroller addSubview:label];
    [self.scroller setContentSize:CGSizeMake(self.view.frame.size.width * 2 + offset, 0)];
    [self.scroller setContentInset:UIEdgeInsetsMake(0, -offset, 0, 0)];
}

Die Einfügungen sind die EINZIGE Möglichkeit, Ihren Scroller zu zwingen, ein "Fenster" für den Inhalt zu haben, in dem Sie ihn haben möchten. Ich spiele immer noch mit diesem Beispielcode, aber die Idee ist da: Verwenden Sie die Einfügungen, um ein "Fenster" auf Ihrem zu bekommen UIScrollView.

Dan Rosenstark
quelle