Para que serve a propriedade contentInset do UIScrollView?

158

Alguém pode me explicar para que UIScrollViewé usada a propriedade contentInset em uma instância? E talvez dê um exemplo?

ForeignerBR
fonte

Respostas:

240

Ele define a distância da inserção entre a visualização de conteúdo e a visualização de rolagem anexa.

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)

Aqui está um bom artigo da Biblioteca de referência do iOS sobre visualizações de rolagem que possui uma captura de tela informativa (fig. 1-3) - vou replicá-la via texto aqui:

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


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

A exibição de rolagem inclui a exibição de conteúdo mais o preenchimento fornecido pelas inserções de conteúdo especificadas.

jball
fonte
é usado para adicionar um preenchimento ao UIScrollView? Se não, você poderia me dar um exemplo prático. Meu problema não é como implementá-lo, mas quando implementá-lo.
ForeignerBR
28
Sim, ele preenche o conteúdo na parte interna da exibição de rolagem. É semelhante à paddingpropriedade CSS .
Marc W
Desculpe por pegar carona nisso, posso fazer a sua própria pergunta, mas com base nisso, o que realmente acontece se você definir cada valor contentInset como 0 diferente de contentHeight, por exemplo? Isso força a visualização de rolagem inteira à altura em que você a define?
jakev
@jakev Não, a propriedade .frame controla as dimensões da scrollview dentro de seu pai (consulte esta resposta: stackoverflow.com/questions/5361369/… ). Definir o contentInsets como 0 para todos os lados significa simplesmente que o conteúdo não será preenchido na visualização de rolagem. Portanto, quando você rola para o topo, o conteúdo fica bem no topo da visualização de rolagem. Se você rolar para a parte inferior, o conteúdo alcançará a parte inferior da visualização da rolagem.
21413 Jeremy Wiebe
é possível manter o contentInset sempre, mesmo quando a rolagem sempre mantém marin no topo (contenInset) do scrollView
Chlebta
86

Embora a resposta do jball seja uma excelente descrição das inserções de conteúdo, ela não responde à questão de quando usá-lo. Vou emprestar seus diagramas:

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

É isso que você obtém quando faz isso, mas a utilidade disso só aparece quando você rola:

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

A linha superior do conteúdo ainda estará visível porque ainda está dentro do quadro da visualização de rolagem. Uma maneira de pensar no deslocamento superior é "quanto mover o conteúdo para baixo na exibição de rolagem quando estamos rolados até o topo"

Para ver um local em que isso é realmente usado, consulte o aplicativo Fotos incorporado no iphone. A barra de navegação e a barra de status são transparentes e o conteúdo da exibição de rolagem é visível embaixo. Isso ocorre porque o quadro da exibição de rolagem se estende até esse ponto. Mas, se não fosse o conteúdo inserido, você nunca conseguiria deixar a parte superior do conteúdo limpa nessa barra de navegação transparente ao percorrer todo o caminho até o topo.

Fabian
fonte
O bom aqui é que você pode usar as inserções para criar o efeito "rolar sob a barra de status com desfoque".
TheEye 12/03
O exemplo sobre o aplicativo de fotos foi fácil de entender.
abhimuralidharan 14/09/17
8

As inserções de conteúdo resolvem o problema de ter conteúdo que fica abaixo de outras partes da interface do usuário e ainda permanece acessível usando barras de rolagem. Em outras palavras, o objetivo do Content Inset é tornar a área de interação menor que sua área real.

Considere o caso em que temos três áreas lógicas da tela:

TOP BUTTONS

TEXT

BOTTOM TAB BAR

e queremos que o TEXTO nunca apareça de forma transparente embaixo dos BOTÕES SUPERIORES, mas queremos que o Texto apareça embaixo da BARRA DE TABELA INFERIOR e, ainda assim, permita a rolagem para que possamos atualizar o texto de forma transparente sob a BARRA DE TABELA INFERIOR.

Em seguida, definiríamos a origem superior para ficar abaixo dos BOTÕES SUPERIORES e a altura para incluir a parte inferior da BARRA DE TABELA INFERIOR. Para obter acesso ao Texto abaixo do conteúdo da BARRA DE TABELA, definiríamos a inserção inferior como a altura da BARRA DE TABELA.

Sem a inserção, o scroller não permite que você role o conteúdo o suficiente para digitar nele. Com a inserção, é como se o conteúdo tivesse "CONTEÚDO EM BRANCO" extra do tamanho da inserção do conteúdo. O texto em branco foi "inserido" no "conteúdo" real - é assim que me lembro do conceito.

Faisal Memon
fonte
4

É usado para adicionar preenchimento UIScrollView

Sem contentInset, uma visualização de tabela é assim:

insira a descrição da imagem aqui

Em seguida, defina contentInset:

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

O efeito é o seguinte:

insira a descrição da imagem aqui

Parece ser melhor, certo?

E eu escrevo um blog para estudar contentInset, críticas são bem vindas.

fujianjin6471
fonte
2

Ótima pergunta.

Considere o seguinte exemplo ( scrolleré um 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)];
}

As inserções são a ÚNICA maneira de forçar seu scroller a ter uma "janela" no conteúdo onde você deseja. Ainda estou mexendo com esse código de exemplo, mas a idéia está aí: use as inserções para obter uma "janela" no seu UIScrollView.

Dan Rosenstark
fonte