Estou criando um aplicativo que terá uma pergunta em uma UILabel
e uma resposta de múltipla escolha exibida em UITableView
cada linha mostrando uma múltipla escolha. As perguntas e as respostas variam, por isso preciso UITableView
que seja dinâmico em altura.
Gostaria de encontrar uma sizeToFit
solução alternativa para a mesa. Onde o quadro da tabela está definido para a altura de todo o seu conteúdo.
Alguém pode aconselhar sobre como eu posso conseguir isso?
- sizeToFit
método do UIView ?Respostas:
Na verdade, eu mesmo encontrei a resposta.
Acabei de criar um novo
CGRect
para otableView.frame
com oheight
detable.contentSize.height
Isso define a altura do
UITableView
para oheight
conteúdo. Como o código modifica a interface do usuário, não esqueça de executá-lo no thread principal:fonte
Solução Swift 5 e 4.2 sem KVO, DispatchQueue ou sem restrições de configuração.
Esta solução é baseada na resposta de Gulz .
1) Crie uma subclasse de
UITableView
:2) Adicione a
UITableView
ao seu layout e defina restrições por todos os lados. Defina a classe dele comoContentSizedTableView
.3) Você verá alguns erros, porque o Storyboard não leva
intrinsicContentSize
em consideração nossa subclasse ' . Corrija isso abrindo o inspetor de tamanho e substituindo o intrinsicContentSize por um valor de espaço reservado. Esta é uma substituição para o tempo de design. Em tempo de execução, ele usará a substituição em nossaContentSizedTableView
classeAtualização: código alterado para o Swift 4.2. Se você estiver usando uma versão anterior, use em
UIViewNoIntrinsicMetric
vez deUIView.noIntrinsicMetric
fonte
tableView
que estavaIntrinsicTableView
no storyboard. Não precisei incorporar minha exibição de tabela em outraUIView
.tableView
paraIntrinsicTableView
. TambémUIView
não é necessário um invólucro extra . Você pode usar qualquer vista pai existente é claro :)tableView.sizeToFit()
sizeToFit()
as necessidades de ser chamadoSolução Swift
Siga esses passos:
1- Defina a restrição de altura para a tabela no storyboard.
2- Arraste a restrição de altura do storyboard e crie @IBOutlet para ela no arquivo do controlador de exibição.
3- Em seguida, você pode alterar a altura da tabela dinamicamente usando este código:
Atualizar
Se a última linha for cortada para você, tente chamar viewWillLayoutSubviews () na função da célula willDisplay:
fonte
Eu tentei isso no iOS 7 e funcionou para mim
fonte
Adicione um observador para a propriedade contentSize na exibição de tabela e ajuste o tamanho do quadro adequadamente
depois no retorno de chamada:
Espero que isso ajude você.
fonte
Eu tinha uma exibição de tabela dentro da exibição de rolagem e tive que calcular a altura do tableView e redimensioná-la de acordo. Esses são os passos que eu tomei:
0) adicione um UIView ao seu scrollView (provavelmente funcionará sem esta etapa, mas eu fiz isso para evitar possíveis conflitos) - essa será uma exibição de conteúdo para sua exibição de tabela. Se você seguir esta etapa, defina as bordas das visualizações exatamente como as da visualização de tablaturas.
1) crie uma subclasse de UITableView:
2) defina a classe de uma exibição de tabela no Storyboard para IntrinsicTableView: captura de tela: http://joxi.ru/a2XEENpsyBWq0A
3) Defina o heightConstraint para a sua exibição de tabela
4) arraste o IBoutlet da sua tabela para o seu ViewController
5) arraste o IBoutlet da restrição de altura da sua tabela para o seu ViewController
6) adicione este método ao seu ViewController:
Espero que isto ajude
fonte
Caso você não queira acompanhar o tamanho do conteúdo da visualização da tabela, você pode achar útil essa subclasse.
fonte
override public var intrinsicContentSize: CGSize { //... return someCGSize }
Caso seu contentSize não esteja correto, isso se deve ao valor estimado de Rowowe (automático), use-o antes
fonte: https://forums.developer.apple.com/thread/81895
fonte
Swift 3, iOS 10.3
Solução 1: Basta colocar
self.tableview.sizeToFit()
emcellForRowAt indexPath
função. Defina a altura da tableview mais alta do que você precisa. Esta é uma boa solução se você não tiver visualizações abaixo da visualização da tabela. No entanto, se você tiver, a restrição inferior da visualização da tabela não será atualizada (não tentei corrigi-la porque criei a solução 2)Exemplo:
Solução 2: defina a restrição de altura da tableview no storyboard e arraste-a para o ViewController. Se você conhece a altura média da sua célula e sabe quantos elementos sua matriz contém, você pode fazer algo assim:
*EDITAR:
Depois de todas as soluções que tentei e todas estavam corrigindo algo, mas não completamente, esta é a resposta que explica e corrige esse problema completamente.
fonte
A resposta de Mimo e resposta de Anooj VM ambos são impressionantes, mas há um pequeno problema se você tem uma lista grande, é possível que a altura do quadro vai corte algumas das suas células.
Assim. Eu modifiquei a resposta um pouco:
fonte
Existe uma maneira muito melhor de fazer isso se você usar o AutoLayout: altere a restrição que determina a altura. Apenas calcule a altura do conteúdo da tabela, encontre a restrição e altere-a. Aqui está um exemplo (supondo que a restrição que determina a altura da sua tabela seja na verdade uma restrição de altura com a relação "Igual"):
fonte
myTableHeightConstraint.constant = tableView.contentSize.height
Isso funciona para mim usando o Layout automático, com uma exibição de tabela com apenas uma seção.
Eu chamo essa função ao configurar o Layout automático (a amostra aqui usa o SnapKit, mas você entendeu):
Quero que o UITableView seja tão alto quanto a altura combinada das células; Eu atravesso as células e acumulo a altura total das células. Como o tamanho da exibição da tabela é CGRect.zero neste momento, preciso definir os limites para poder respeitar as regras de layout automático definidas pela célula. Defino o tamanho como um valor arbitrário que deve ser grande o suficiente. O tamanho real será calculado posteriormente pelo sistema Auto Layout.
fonte
Eu fiz de uma maneira um pouco diferente. Na verdade, o meu TableView estava dentro do scrollview, então eu tive que dar uma restrição de altura como 0.
Então, no tempo de execução, fiz as seguintes alterações,
fonte
Como uma extensão da resposta da Anooj VM, sugiro o seguinte para atualizar o tamanho do conteúdo apenas quando ele for alterado.
Essa abordagem também desabilita a rolagem corretamente e suporta listas e rotação maiores . Não há necessidade de dispatch_async porque as alterações contentSize são despachadas no encadeamento principal.
fonte
versão objc do Musa almatri
fonte
Você pode experimentar este costume
AGTableView
Para definir uma restrição de altura do TableView Usando o storyboard ou programaticamente. (Essa classe busca automaticamente uma restrição de altura e define a altura da visualização do conteúdo como sua altura da visualização da tabela).
Nota Se houver algum problema para definir uma altura, então
yourTableView.layoutSubviews()
.fonte
Com base na resposta de fl034 . Mas para usuários do Xamarin.iOS :
fonte
Minha implementação do Swift 5 é definir a alta restrição do tableView para o tamanho do seu conteúdo (
contentSize.height
). Este método supõe que você esteja usando o layout automático. Este código deve ser colocado dentro docellForRowAt
método tableView.fonte
Se você deseja que sua tabela seja dinâmica, será necessário usar uma solução com base no conteúdo da tabela, conforme detalhado acima. Se você simplesmente deseja exibir uma tabela menor, pode usar uma exibição de contêiner e incorporar um UITableViewController nela - o UITableView será redimensionado de acordo com o tamanho do contêiner.
Isso evita muitos cálculos e chamadas para o layout.
fonte
above
porque as respostas podem ser embaralhadas.Mu solução para isso no rápido 3 : Chame este método em
viewDidAppear
fonte