Existe uma maneira de fazer um UIScrollView
ajuste automático à altura (ou largura) do conteúdo que está rolando?
Algo como:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
iphone
ios
objective-c
cocoa-touch
uiscrollview
jwerre
fonte
fonte
viewDidLayoutSubviews
para que o autolayout terminasse, no iOS7 funcionou bem, mas testar o iOS6 por algum motivo não terminou o trabalho, então eu tinha alguns valores de altura errados, então mudei paraviewDidAppear
agora funciona bem .. apenas para apontar que talvez alguém precise disso. obrigadoO UIScrollView não conhece a altura do seu conteúdo automaticamente. Você deve calcular a altura e a largura para si mesmo
Faça isso com algo como
Mas isso só funciona se as visualizações estiverem uma abaixo da outra. Se você tiver uma visualização próxima, precisará adicionar a altura de uma se não quiser definir o conteúdo do scroller maior do que realmente é.
fonte
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Solução se você estiver usando o layout automático:
Defina
translatesAutoresizingMaskIntoConstraints
comoNO
em todas as visualizações envolvidas.Posicione e dimensione sua exibição de rolagem com restrições externas à exibição de rolagem.
Use restrições para organizar as subvisões na visualização de rolagem, certificando-se de que as restrições estejam vinculadas às quatro arestas da visualização de rolagem e não se baseiem na visualização de rolagem para obter seu tamanho.
Fonte: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
fonte
Eu adicionei isso à resposta de Espuz e JCC. Ele usa a posição y das subvisões e não inclui as barras de rolagem. Editar Usa a parte inferior da subvisualização mais baixa visível.
fonte
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
no começo eself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
no final do método?Aqui está a resposta aceita rapidamente para quem é muito preguiçoso para convertê-lo :)
fonte
Aqui está uma adaptação do Swift 3 da resposta de @ leviatan:
EXTENSÃO
USO
Muito fácil de usar!
fonte
A extensão a seguir seria útil no Swift .
A lógica é a mesma com as respostas dadas. No entanto, omite as visualizações ocultas
UIScrollView
e o cálculo é realizado após os indicadores de rolagem serem ocultos.Além disso, há um parâmetro de função opcional e você pode adicionar um valor de deslocamento passando o parâmetro para a função.
fonte
Excelente e melhor solução de @leviathan. Apenas traduzindo para rápido usando a abordagem FP (programação funcional).
fonte
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Você pode obter a altura do conteúdo no UIScrollView calculando qual filho "alcança mais longe". Para calcular isso, é necessário levar em consideração a origem Y (início) e a altura do item.
Fazendo assim, os itens (subvisões) não precisam ser empilhados diretamente um sob o outro.
fonte
Eu vim com outra solução baseada na solução da @ Montenegro
Basicamente, descobrimos qual elemento está mais abaixo na visualização e adicionamos um preenchimento de 10px na parte inferior
fonte
Como um scrollView pode ter outros scrollViews ou uma árvore inDepth subViews diferente, é preferível executar em profundidade recursivamente.
Swift 2
Uso
fonte
Ou apenas faça:
(Esta solução foi adicionada por mim como um comentário nesta página. Depois de receber 19 votos positivos para esse comentário, decidi adicionar essa solução como uma resposta formal para o benefício da comunidade!)
fonte
Para swift4 usando reduzir:
fonte
O tamanho depende do conteúdo carregado dentro dele e das opções de recorte. Se for uma visualização de texto, também depende da disposição, quantas linhas de texto, tamanho da fonte e assim por diante. Quase impossível para você se calcular. A boa notícia é que é calculada após o carregamento da visualização e no viewWillAppear. Antes disso, é tudo desconhecido e o tamanho do conteúdo será igual ao tamanho do quadro. Mas, no método viewWillAppear e depois (como o viewDidAppear), o tamanho do conteúdo será o real.
fonte
Envolvendo o código de Richy, criei uma classe UIScrollView personalizada que automatiza o redimensionamento completo do conteúdo!
SBScrollView.h
SBScrollView.m:
Como usar:
Simplesmente importe o arquivo .h para o seu controlador de exibição e declare uma instância do SBScrollView em vez da instância normal do UIScrollView.
fonte
Defina o tamanho do conteúdo dinâmico como este.
fonte
depende realmente do conteúdo: content.frame.height pode dar o que você deseja? Depende se o conteúdo é uma coisa única ou uma coleção de coisas.
fonte
Também achei a resposta do leviatã para funcionar melhor. No entanto, estava calculando uma altura estranha. Ao percorrer as subvisões, se a visualização de rolagem estiver configurada para mostrar indicadores de rolagem, eles estarão na matriz de subvisões. Nesse caso, a solução é desativar temporariamente os indicadores de rolagem antes de fazer o loop e, em seguida, restabelecer sua configuração de visibilidade anterior.
-(void)adjustContentSizeToFit
é um método público em uma subclasse personalizada do UIScrollView.fonte
Eu acho que essa pode ser uma maneira interessante de atualizar o tamanho da visualização de conteúdo do UIScrollView.
fonte
por que não uma única linha de código?
fonte
fonte