ios - working - Dimensionando uma exibição de contêiner com um controlador de tamanho dinâmico dentro de uma vista de rolagem




working with scrollview in swift (3)

A partir da resposta do @Mischa consegui fazer a altura de um containerView dinâmico dependendo do seu conteúdo fazendo isso:

No viewController do containerView escreva:

  override func loadView() {
    super.loadView()
    view.translatesAutoresizingMaskIntoConstraints = false
  }

E tomando cuidado para que as restrições verticais no IB estejam todas definidas. Fazendo isso, você não precisa definir view.translatesAutoresizingMaskIntoConstraints = false de fora do controlador de visualização.

No meu caso eu estava tentando redimensionar o container para um tableView dentro do viewController. Como o tableView tem uma altura flexível, dependendo de sua superview (então, tudo OK para IB), eu completei as restrições verticais no código fazendo isso:

  @IBOutlet private var tableView: UITableView! {
    didSet {
      tableView.addConstraint(tableViewHeight)
    }
  }
  private lazy var tableViewHeight: NSLayoutConstraint = NSLayoutConstraint(item: self.tableView, attribute: NSLayoutAttribute.Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0)

Em seguida, observe a altura contentSize da tableview e ajuste a constante da restrição tableViewHeight programaticamente, quando necessário.

Eu estou tentando criar uma exibição de contêiner, com um controlador que tem uma altura dinâmica, dentro de um UIScrollView e tê-lo dimensionado automaticamente usando o layout automático.

O Controlador de Visualização A é a visualização de rolagem, que inclui a visualização do contêiner, juntamente com mais conteúdo abaixo.

O Controlador de Visualização B é o controlador de visualização que desejo ter um tamanho dinâmico e que todo o conteúdo seja exibido em altura total na Visualização de Rolagem do View Controller A.

Estou tendo alguns problemas para obter o tamanho dinâmico de B para definir automaticamente o tamanho da Visualização de Contêiner em A. No entanto, se eu definir uma restrição de altura na Exibição de Contêiner em A ,

Seria a saída esperada se o View Controller B também tivesse 250 de altura. Ele também funciona bem para a altura 1000, então, até onde eu sei, todas as restrições de layout automático estão configuradas corretamente. Infelizmente, como a altura deve ser realmente dinâmica, eu gostaria de evitar a configuração de uma restrição de altura.

Não tenho certeza se existem configurações para o controlador de visualização que o BI pode definir para que ele atualize automaticamente seu tamanho dependendo de seu conteúdo ou se houver algum outro truque que tenha perdido. Qualquer ajuda seria muito apreciada!

Existe alguma maneira de dimensionar o Container View em A de acordo com o tamanho do View Controller B, sem definir uma restrição de altura?


Com base na ótima solução do @ Mischa para esse problema, se o contêiner incorpora um UITableView dimensionado dinamicamente, você precisa ignorar o contentSize e o intrinsicContentSize , além de definir translatesAutoresizingMaskIntoConstraints = false acordo com a resposta aceita.

Quando a visualização pai carrega e configura a exibição de contêiner, a altura intrínseca de cada UITableViewCells é inferida como sendo 0, portanto, o método UITableViewDelegate de:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

não será chamado. Isso faz com que o UITableView apareça como se não tivesse conteúdo.

Substituir o tamanho do conteúdo intrínseco para retornar o tamanho real do conteúdo significa que a visualização da tabela é exibida com o tamanho que o conteúdo requer.

Um ótimo article de Emilio Peláez se aprofunda neste tópico.


Swift 4, Xcode 9

A resposta aceita sozinha não resolveu o problema para mim.

Minha hierarquia: ScrollView -> Visualização de Conteúdo (UIView) -> Visualizações | Visão do Contêiner | Outras exibições.

Eu tive que adicionar as seguintes restrições para fazer o ScrollView e o Container ajustarem dinamicamente:

  1. ScrollView : Superior, Inferior, à Direita, À Direção de Superview (Áreas Seguras)
  2. Visualização de Conteúdo : Superior, Inferior, Principal, Trailing, Largura Igual para ScrollView, mas também com Igual Heights (restrição com uma prioridade mais baixa: 250) .
  3. Visualizações : restrições normais de layout automático.
  4. Vista de Contêiner : Vista superior, inferior a vizinho, guia principal e trilha para área segura.
  5. VC incorporado do Container View : Restrição de tudo conectada verticalmente com a restrição inferior configurada para uma prioridade mais baixa, mas maior que a do Equal Height! Neste caso, uma prioridade de 500 resolveu o problema.
  6. Defina view.translatesAutoresizingMaskIntoConstraints = false em prepareForSegue() ou em loadView() como outras respostas declaradas.

Agora eu tenho um Container View dinamicamente ajustável dentro de um modo de rolagem de redimensionamento automático.





uicontainerview