Do czego służy właściwość contentInset UIScrollView?

158

Czy ktoś może mi wyjaśnić, do czego służy właściwość contentInset w UIScrollViewinstancji? A może podać przykład?

ForeignerBR
źródło

Odpowiedzi:

240

Ustawia odległość wstawki między widokiem zawartości a otaczającym widokiem przewijania.

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)

Oto dobry artykuł z biblioteki referencyjnej iOS na temat widoków przewijania, który zawiera pouczający zrzut ekranu (rys. 1-3) - powielę go za pomocą tekstu tutaj:

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


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

Widok przewijania obejmuje widok treści oraz wypełnienie zapewniane przez określone wstawki treści.

jball
źródło
czy jest używany do dodawania wypełnienia do UIScrollView? Jeśli nie, mógłbyś podać mi praktyczny przykład. Mój problem nie polega na tym, jak to wdrożyć, ale kiedy to wdrożyć.
ForeignerBR
28
Tak, wypełnia zawartość wewnątrz widoku przewijania. Jest to podobne do paddingwłaściwości CSS .
Marc W
Przepraszam, że mogę na to poradzić, mogę przenieść to własne pytanie, ale na tej podstawie, co się właściwie stanie, jeśli ustawisz każdą wartość contentInset na 0 inną niż na przykład contentHeight? Czy to zmusza cały widok przewijania do wysokości, którą ustawiłeś?
jakev,
@jakev Nie, właściwość .frame steruje wymiarami widoku przewijania w ramach swojego elementu nadrzędnego (patrz odpowiedź: stackoverflow.com/questions/5361369/ ... ). Ustawienie parametru contentInsets na 0 dla wszystkich stron oznacza po prostu, że zawartość nie będzie w ogóle wypełniana w widoku przewijania. Więc kiedy przewijasz do góry, zawartość jest umieszczona tuż nad górną częścią widoku przewijania. Jeśli przewiniesz w dół, zawartość osiągnie prawy koniec widoku przewijania.
Jeremy Wiebe
czy możliwe jest zachowanie contentInset zawsze, nawet podczas przewijania, zawsze trzymaj marin to top (contenInset)
scrollView
86

Chociaż odpowiedź jball jest doskonałym opisem wstawek z treścią, nie odpowiada jednak na pytanie, kiedy z niej korzystać. Pożyczę z jego diagramów:

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

To właśnie dostajesz, kiedy to robisz, ale użyteczność tego pokazuje się tylko podczas przewijania:

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

Ten górny wiersz treści będzie nadal widoczny, ponieważ nadal znajduje się w ramce widoku przewijania. Jednym ze sposobów wyobrażenia sobie górnego przesunięcia jest „o ile przesunąć zawartość w dół widoku przewijania, gdy jesteśmy przewijani do samego końca”

Aby zobaczyć miejsce, w którym jest to faktycznie używane, spójrz na wbudowaną aplikację Zdjęcia na iPhonie. Pasek nawigacji i pasek stanu są przezroczyste, a zawartość widoku przewijania jest widoczna pod spodem. Dzieje się tak, ponieważ ramka widoku przewijania rozciąga się tak daleko. Ale gdyby nie wstawka z treścią, nigdy nie byłbyś w stanie wyczyścić górnej części treści z przezroczystego paska nawigacyjnego po przejściu na samą górę.

fabiański
źródło
Fajną rzeczą jest to, że możesz użyć wstawek do stworzenia efektu "przewijania pod paskiem stanu z rozmyciem".
TheEye
Przykład aplikacji do zdjęć był łatwy do zrozumienia.
abhimuralidharan
8

Wstawki treści rozwiązują problem polegający na tym, że zawartość znajduje się pod innymi częściami interfejsu użytkownika, a mimo to pozostaje dostępna za pomocą pasków przewijania. Innymi słowy, celem elementu Content Inset jest zmniejszenie obszaru interakcji niż jego rzeczywisty obszar.

Rozważmy przypadek, w którym mamy trzy logiczne obszary ekranu:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

i chcemy, aby TEKST nigdy nie pojawiał się przezroczysto pod GÓRNYMI PRZYCISKAMI, ale chcemy, aby tekst znajdował się pod DOLNYM PASKIEM ZAKŁADKI, a mimo to umożliwiał przewijanie, abyśmy mogli zaktualizować tekst znajdujący się przezroczysto pod PASKIEM ZAKŁADKI DOLNYM.

Następnie ustawilibyśmy górny początek tak, aby znajdował się poniżej GÓRNYCH PRZYCISKÓW, a wysokość tak, aby obejmowała dół DOLNEGO PASKA ZAKŁADKI. Aby uzyskać dostęp do tekstu znajdującego się pod zawartością DOLNEGO PASKA ZAKŁADKI, ustawilibyśmy dolną wstawkę na wysokość DOLNEGO PASKA ZAKŁADKI.

Bez wstawki przewijak nie pozwoliłby na przewinięcie zawartości na tyle, aby można było do niej wpisać. W przypadku wstawki wygląda to tak, jakby treść miała dodatkową „PUSTĄ TREŚĆ” w rozmiarze wstawki z treścią. Pusty tekst został „wstawiony” w prawdziwą „treść” - tak pamiętam koncepcję.

Faisal Memon
źródło
4

Służy do dodawania dopełnienia UIScrollView

Bez contentInsetwidoku tabeli wygląda to następująco:

wprowadź opis obrazu tutaj

Następnie ustaw contentInset:

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

Efekt jest jak poniżej:

wprowadź opis obrazu tutaj

Wydaje się, że jest lepiej, prawda?

I piszę bloga, żeby przestudiować contentInset, krytyka jest mile widziana.

fujianjin6471
źródło
2

Świetne pytanie.

Rozważmy następujący przykład ( scrollerto 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)];
}

Wstawki są JEDYNYM sposobem na wymuszenie na twoim przewijaniu "okienka" na zawartość, gdzie chcesz. Nadal majstruję przy tym przykładowym kodzie, ale idea jest taka: użyj wstawek, aby uzyskać "okno" na swoim UIScrollView.

Dan Rosenstark
źródło