Ambiguidade do tamanho do conteúdo rolável do UIScrollView

510

Colegas de desenvolvimento, estou tendo problemas com o AutoLayout no Interface Builder (Xcode 5 / iOS 7). É muito básico e importante, então acho que todos devem saber como isso funciona corretamente. Se este é um bug no Xcode, é um problema crítico!

Portanto, sempre que tenho uma hierarquia de exibição como essa, tenho problemas:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

O UIScrollView possui restrições sólidas, por exemplo, 50 px de todos os lados (sem problemas). Em seguida, adiciono uma restrição de espaço superior ao UILabel (sem problemas) (e posso até fixar a altura / largura do rótulo, não altera nada, mas deve ser desnecessário devido ao tamanho intrínseco do rótulo)

O problema começa quando adiciono uma restrição à direita no UILabel:

Por exemplo, espaço à direita para: Superview Igual a: 25

Agora, dois avisos ocorrem - e eu não entendo o porquê:

A) Ambigüidade de tamanho de conteúdo rolável (a exibição de rolagem possui altura / largura ambígua de conteúdo rolável)

B) Visualizações incorretas (rótulo esperado: x = -67 Real: x = 207

Fiz este exemplo mínimo em um projeto recém-baixado, que você pode baixar e anexei uma captura de tela. Como você pode ver, o Interface Builder espera que o Label fique fora do limite do UIScrollView (o retângulo tracejado laranja). A atualização do quadro da etiqueta com a ferramenta Resolver problemas move-a para a direita.

Observação: se você substituir o UIScrollView por um UIView, o comportamento será o esperado (o quadro do Label está correto e de acordo com a restrição). Portanto, parece haver um problema com o UIScrollView ou estou perdendo algo importante.

Quando executo o aplicativo sem atualizar o quadro do Label, conforme sugerido pelo IB, ele está posicionado perfeitamente, exatamente onde deveria estar e o UIScrollView é rolável. Se eu atualizar o quadro, a etiqueta estará fora de vista e o UIScrollView não rolará.

Ajude-me Obi-Wan Kenobi! Por que o layout ambíguo? Por que a visão equivocada?

Você pode baixar o projeto de amostra aqui e tentar descobrir o que está acontecendo: https://github.com/Wirsing84/AutoLayoutProblem

Ilustração do problema no Interface Builder

Wirsing
fonte
8
Tente colocar o UILabel em uma exibição de conteúdo e, em seguida, defina a borda à direita do rótulo para a exibição de conteúdo (UIView regular). Este vídeo pode ajudá-lo muito: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser
1
Ótimo vídeo, mas não corrigiu os avisos para mim. :(
Sr. Rogers
Muito obrigado pelo vídeo - aprendi bastante (surpreendentemente) com ele! No entanto, quando combino o conhecimento do vídeo com stackoverflow.com/questions/18953617/… , posso corrigir os avisos. A questão que permanece é: como tornar o tamanho contentView do scrollView tão grande quanto necessário?
Wirsing
Dê uma olhada neste vídeo. Ele mostra como usar UIScrollLayout e autolayout com o XCode 5 / iOS 7.
jaxvy
Minha sugestão é não usar UIScrollViewdiretamente. Em vez disso, use UICollectionViewou UITableViewo máximo possível, principalmente tudo é possível com esse elemento e também fornece simplicidade, legibilidade e reutilização !!!
SPatel

Respostas:

1093

Então, eu apenas resolvi desta maneira:

  1. Dentro do UIScrollView add a UIView(podemos chamar assim contentView);

  2. Nesse caso contentView, defina as margens superior, inferior, esquerda e direita como 0 (é claro scrollViewque é essa a superView); O conjunto também alinha o centro horizontal e verticalmente ;

Terminado .

Agora você pode adicionar todos os seus pontos de vista em que contentView, e contentSizedo scrollViewserão automaticamente redimensionadas de acordo com o contentView.

Atualizar:

Algum caso especial é coberto por este vídeo postado por @Sergio nos comentários abaixo.

Matteo Gobbi
fonte
33
Quase perfeita, exceto que a visualização de rolagem não pode mais adivinhar a duração do seu conteúdo e redimensioná-la de acordo com o tamanho do conteúdo para caber nos objetos. Eu tenho uma tableview dentro do contentView cuja altura muda (via restrição) e a scrollview não me permite rolar.
CyberMew
28
Talvez este vídeo possa ajudar a superar todos os problemas restantes.
11743 Sergio
46
isso não faz rolagem tho.
Dorian
2
@MatteoGobbi Foi isso! Ele fez o truque! Estava lutando com esse tipo de problemas de scrollView loucura de AutoLayout por 2 dias .... Obrigado cara !!!
precisa saber é o seguinte
56
Para quem enfrenta problemas com o ScrollView não ser rolável, definir o fundo e o alinhamento vertical do contentView com restrições verticais com baixa prioridade fez o truque para mim!
Jimmy0251 13/05
98

Esse erro levou um tempo para ser rastreado. Inicialmente, tentei fixar o tamanho do ScrollView, mas a mensagem de erro diz claramente "tamanho do conteúdo". Certifiquei-me de que tudo que fixei da parte superior do ScrollView também fosse fixado na parte inferior. Dessa forma, o ScrollView pode calcular a altura do conteúdo localizando a altura de todos os objetos e restrições. Isso resolveu a altura do conteúdo ambíguo, a largura é bem semelhante ... Inicialmente, eu tinha quase tudo que X estava centrado no ScrollView, mas também tinha que fixar os objetos na lateral do ScrollView. Não gosto disso porque o iPhone6 ​​pode ter uma tela maior, mas removerá o erro 'largura do conteúdo ambíguo'.

self.name
fonte
31
Obrigado pela sua resposta! Se bem entendi, você consegue remover o erro fixando todas as subvisões no ScrollView na parte superior e inferior. No entanto, isso não é necessário. Você só precisa ter certeza de que existe uma maneira de criar uma linha contínua de restrições de cima para baixo na visualização de rolagem. [-XXX] Espero que seja compreensível;>
Wirsing
1
Como corrigir o problema se a exibição tiver uma altura variável? Como configuro as restrições para que o scrollview possa calcular os tamanhos?
Hashier 24/10
2
'Você apenas tem que certificar-se de que há uma maneira de fazer uma linha contínua de restrições a partir do topo para o fundo da scrollview' <- obrigado por essa frase
Adam Waite
3
O que me ajudou foi garantir que a exibição de rolagem fosse fixada na superview e não nas guias de layout superior ou inferior. Removai a restrição do guia de layout inferior e passei pelo menu em vez do construtor de interface. Editor -> Fixar -> Espaço Inferior na Superview.
Alberto Lopez
2
Se você deseja que a largura da visualização de rolagem siga a largura da tela do telefone ou qualquer outro elemento da interface do usuário (como o UIView que contém), defina a "largura igual" usando outro elemento que esteja fora da visualização de rolagem para medir.
Departamento B
89

Xcode 11+

A maneira mais simples de usar autolayout:

  1. Adicione UIScrollViewe fixe 0,0,0,0na superview (ou no tamanho desejado)
  2. Adicione o UIViewScrollView, fixe-o 0,0,0,0nos quatro lados e centralize-o horizontallye vertically.
  3. No inspetor de tamanho, altere bottome align center Ypriorize para 250. (para alteração de rolagem horizontal trailinge align center X)
  4. Adicione todas as visualizações necessárias nessa exibição. Não se esqueça de definir a restrição inferior na vista mais baixa.
  5. Selecione UIScrollView, selecione o inspetor de tamanho e desmarque Content Layout Guides.
Đorđe Nilović
fonte
1
Não consegui definir a altura do conteúdo do scrollview, mas funciona. :)
Blind Ninja
2
Dica: por mim funcionou apenas se eu removesse o centro horizontal e verticalmente e o substituísse por largura igual (scrollView + view dentro de scrollView) E adicionando a altura com base no conteúdo, o que significa que o último elemento da visualização precisa de uma restrição inferior. Procure aqui para obter mais informações: stackoverflow.com/a/54577278/5056173 #
Sean Stayns 07/02/19
1
Sean, estou usando isso literalmente todos os dias e nunca tive problemas com essa abordagem quando se trata de rolagem de rolagem vertical e horizontal. Talvez você tenha esquecido de colocar uma restrição inferior no elemento mais baixo / último. Sem isso, isso não vai funcionar.
Norđe Nilović
7
Ponto número 4 - a segunda frase é a maior.
Nitish
2
esta resposta funcionou perfeitamente para mim
satvinder singh 26/01
63

É a resposta para minha pergunta auto-respondida UIScrollView + Visão centralizada + Tamanho do conteúdo rolável ambíguo + muitos tamanhos de iPhone .

Mas também cobre totalmente o seu caso!

Então, aqui está o estado inicial para o caso mais simples:

  1. scrollView com 0 restrições para todas as arestas
  2. Horizontal e vertical centralizado no botão com restrições fixas de largura e altura
  3. E, é claro - avisos irritantes Has ambiguous scrollable content width e Has ambiguous scrollable content height.

1

Tudo o que precisamos fazer é:

  • Adicione 2 restrições adicionais, por exemplo "0" para o espaço à direita e / ou inferior , para nossa visualização (veja o exemplo na captura de tela abaixo).

Importante: você deve adicionar restrições à direita e / ou inferiores . Não é "líder e top" - não é obras!

2

Você pode verificá-lo no meu projeto de exemplo , demonstrando como corrigir esse problema.

PS

Segundo a lógica - essa ação deve causar "restrições conflitantes". Mas não!

Não sei por que ele funciona e como o Xcode detecta qual restrição é mais priorizada (porque não tenho prioridade para explicitamente essas restrições). Ficarei agradecido se alguém explicar, por que isso funciona nos comentários abaixo.

skywinder
fonte
Ótima dica! I terminou apenas criar uma restrição para a borda inferior e conjunto prioridade a médio ou baixo
Dean
Uau! Isso seriamente não faz sentido, mas funciona! Obrigado! O último item que tenho, na minha opinião, defina uma restrição inferior de 0 e BANG. Finalmente funcionou.
Jakob Hviid
60

Xcode 11+, Swift 5

Se você está se perguntando por que todas as respostas não funcionam mais, verifique se fixou a visualização de conteúdo (aquela que você inseriu na visualização de rolagem) no Guia de Layout de Conteúdo da visualização de rolagem e NÃO no Guia de Layout de Quadro.

As bordas da exibição de conteúdo (à esquerda, à direita, à esquerda, na parte superior e na parte inferior) não devem ser fixadas como à esquerda na imagem - para o Guia de layout de quadros

Assim não

mas assim - no Guia de layout de conteúdo.

Selecione o Guia de Layout de Conteúdo no menu suspenso

insira a descrição da imagem aqui

E então a maioria das respostas funcionará para você.

A abordagem mais simples agora é a seguinte:

  1. Coloque a visualização de rolagem na visualização raiz
  2. Fixar todos os lados da visualização de rolagem na superview
  3. Pegue outra UIView (chama-se visualização de conteúdo) e coloque-a na visualização de rolagem
  4. Fixar todos os lados da visualização de conteúdo para rolar o Guia de Layout de Conteúdo
  5. Fixar a largura da visualização de conteúdo como igual ao Guia de layout de quadro da visualização de rolagem
  6. Corrija a altura da exibição de conteúdo da maneira que desejar (usei apenas restrição de altura constante no exemplo abaixo)

No geral, sua estrutura na implementação mais simples será parecida com esta

insira a descrição da imagem aqui

Quer saber
fonte
@WantToKnow Não há necessidade de levar a restrição de altura, basta alterar a sua prioridade para baixo (250)
Reckoner
Xcode 11+, Swift 5. De acordo com a resposta do @WantToKnow, resolvi meu problema, preparei [video] [1] e [code] [2] [1]: youtube.com/watch?v=qMrH5_Yj5hM [2]: github.com/AhmAbdallah/CustomCollectionView
Ahmed Abdallah
1
Esta é uma ótima resposta, obrigado.
Constantine
1
Esta é a resposta certa. Obrigado.
Vincent Joy
Isso funcionou para mim apenas quando adicionei restrição inferior ao último elemento da exibição de conteúdo
D.Zotov
49

Você precisa criar uma UIViewsubvisão do UIScrollViewdescrito abaixo:

  • UIViewController
  • UIView 'Vista principal'
    • UIScrollView
      • UIView 'Visualização de contêiner'
        • [Seu conteúdo]

O segundo passo é fazer as UIScrollViewrestrições. Fiz isso com as restrições superior, inferior, inicial e final do seu superView.

Em seguida, adicionei as restrições para o contêiner de UIScrollViewe aqui é onde o problema começa. Quando você coloca as mesmas restrições (superior, inferior, inicial e final), o Storyboard envia uma mensagem de aviso:

"Possui largura de conteúdo rolável ambígua" e "Possui altura de conteúdo rolável ambígua"

Continue com as mesmas restrições acima e adicione as restrições Equal Heighte Equal Widthà sua Exibição de contêiner em relação à Vista principal e não à sua UIScrollView. Em outras palavras, as restrições da exibição do contêiner estão vinculadas à UIScrollViewsuper visão geral.

Depois disso, você não receberá avisos no seu Storyboard e poderá continuar adicionando as restrições para suas subvisões.

Thiago Monteiro
fonte
2
Concordo - acho que adicionar uma exibição de contêiner é a melhor e mais sustentável solução.
Andrew Ebling
1
Esta solução funcionará quando você não tiver uma barra de navegação para gerenciar.
Leena
26

Eu tive o mesmo problema. Desmarque esta caixa de seleção. Desde que você está definindo o tamanho do conteúdo no código. insira a descrição da imagem aqui

Yodagama
fonte
24

Finalmente descobri isso, espero que seja mais fácil de entender.

Muitas vezes, você pode ignorar esse aviso adicionando um UIView base à visualização de rolagem como uma "exibição de conteúdo", como eles mencionaram e o tornam do mesmo tamanho que sua visualização de rolagem e, nessa exibição de conteúdo, defina esses 6 parâmetros.

insira a descrição da imagem aqui

Como você pode ver, você precisa de 6 parâmetros totais! O que .. em circunstâncias normais, você está duplicando duas restrições, mas esta é a maneira de evitar esse erro no storyboard.

William T.
fonte
1
O exemplo acima quase funcionou para mim, pois estou preocupado com três larguras de tela diferentes (4/5, 6, 6+). Defino a exibição de conteúdo e a exibição de rolagem para ter larguras iguais. Você está certo, é uma duplicata, como eu já disse à exibição de conteúdo para ter 0 espaço inicial e final.
Stuart P.
8
Você pode definir restrições iguais de largura e altura da exibição de conteúdo para a exibição de rolagem, em vez de valores constantes. Isso funcionará em todas as resoluções.
Kumar C
Eu tenho que implementar o mesmo, então você pode me ajudar que eu tenho que definir altura e largura iguais para exibição de conteúdo e exibição de rolagem?
precisa saber é
Pode valer a pena conferir para ver se você ainda precisa fazer isso. Eu configurei um imageView em um scrollview recentemente e fui capaz de me livrar apenas das 4 restrições mostradas na parte superior para fazer com que o erro desapareça no Xcode 8.3
William T.
1
@ Mel foi publicado há mais de 3 anos. Eles definitivamente melhoraram os storyboards desde então. Eu também notei que você pode fugir sem a visualização de conteúdo agora. Eu ajustarei minha resposta.
William T.
16

Sei que estou atrasado, mas a próxima solução resolve esse tipo de problema sem código adicional , apenas usando storyboards:

Para sua visualização de conteúdo, você precisa definir restrições para os espaços à esquerda / à direita / superior / inferior para visualizar a rolagem e isso não altera o quadro da visualização de conteúdo , assim:insira a descrição da imagem aqui

Obviamente, você precisa criar restrições adicionais para a exibição do conteúdo, para que a exibição por rolagem possa saber o tamanho do conteúdo. Por exemplo, defina a altura fixa e o centro x.

Espero que isto ajude.

Borzh
fonte
7

Para mim, adicionar um contentViewrealmente não funcionou como sugerido. Além disso, ele cria uma sobrecarga devido à visão adicional (embora eu não considere isso um grande problema). O que funcionou melhor para mim foi apenas desativar a verificação de ambiguidade para o meu scrollView. Tudo está bem, então acho que está tudo bem em casos simples como o meu. Mas lembre-se de que, se houver outras restrições à sua scrollViewinterrupção, o Interface-Builder não avisará mais sobre isso.

insira a descrição da imagem aqui

Nick Podratz
fonte
5
Isso removerá o aviso e não fará nada para resolver o problema.
Predrag Manojlovic
Vocês. estamos. meu. herói. Não sabia que isso existia e estou muito satisfeito em encontrá-lo! Eu tentei "Verificar apenas a posição", que você esperaria, não sei, verificar apenas a posição, mas não, isso também permite esse problema de "tamanho do conteúdo". Tenho que ir com "Nunca verificar". Obrigado!
Dustin
Eu acho que essa é a resposta certa se você estiver criando a visão filho programaticamente. Obrigado!
Florian Kusche 6/03
6

Confira este tutorial muito rápido e direto sobre como obter a visualização de rolagem funcionando e totalmente rolável com layout automático. Agora, a única coisa que ainda me deixa perplexa é por que o tamanho do conteúdo da visualização de rolagem é sempre maior que o necessário.

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

Mike Simz
fonte
3

Veja abaixo: visualização de conteúdo em scrollview vertical e horizontal centralizada. você recebeu um erro de ambiguidade, sempre verifique se os dois adicionados à visualização de rolagem a partir da visualização de conteúdo são 1) .botão de espaço no contêiner.

esses meios de restrição na rolagem são quanto você pode rolar após a altura ou largura da exibição do conteúdo.

insira a descrição da imagem aqui

isso pode ajudá-lo.

Ravi Kumar
fonte
3

Resolvi esse tipo de problema para minha visualização usando "Resolver problemas de layout automático"> "Adicionar restrições ausentes" na Visualização Selecionada insira a descrição da imagem aqui

As duas restrições a seguir resolvem meu problema:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

em que: final, inferior, é o final, inferior do UIScrollView

Linh Dao
fonte
Isso funcionou para mim adicionando uma restrição "de baixo para baixo". Agora que penso nisso, faz todo o sentido.
SilverWolf - Restabelecer Monica
3

Usando contentView ( UView) como no interior do recipiente UIScrollView, a vara bordas ( top, bottom, trailing, leading) de superview ( UIScrollView) e contentViewdeve ter equalwidthe equalheighta superview. Essas são restrições. E chamada de método:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Problemas resolvidos para mim.

Spiridon Kopicl
fonte
3

Abordagem Swift 4+:

1) Defina as margens superior, inferior, esquerda e direita do UIScrollView como 0

2) Dentro do UIScrollView, adicione um UIView e defina as margens superior, inferior, à esquerda e à direita como 0 (igual às margens do UIScrollView).

3) A parte mais importante é definir a largura e a altura, onde a restrição de altura deve ter baixa prioridade .

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}
Genciana Sadiku
fonte
2

A resposta de @Matteo Gobbi é perfeita, mas no meu caso, a scrollview não pode rolar, removo " align center Y " e adiciono " height> = 1 ", a scrollview se torna rolável

ygweric
fonte
2

As pessoas que estão enfrentando dificuldades com o uiscrollview e não rolam apenas definem a restrição inferior da visualização de conteúdo com o layout inferior da última visualização (que fica dentro da visualização de conteúdo). Não se esqueça de remover a restrição central Y.

Descanse todas as restrições são as mesmas definidas acima. A visualização de rolagem preocupa-se apenas em obter a altura máxima da visualização de conteúdo, e a definimos como a restrição inferior da última visualização, o que significa que a visualização de rolagem alterará automaticamente o deslocamento do conteúdo.

No meu caso, a última visualização foi UILable com nenhuma propriedade de linhas = 0 (que ajusta automaticamente sua altura dependendo do conteúdo) para aumentar dinamicamente a altura do uilable e, eventualmente, nossa área de rolagem aumenta devido ao layout inferior do uilable estar alinhado com o fundo da visualização de conteúdo, o que força a visualização de rolagem para aumentar o deslocamento do conteúdo.

Siddhesh Mahadeshwar
fonte
2

Criei um vídeo no youTube
Scroll StackViews usando apenas Storyboard no Xcode

Eu acho que dois tipos de cenários podem aparecer aqui.

A vista dentro do scrollView -

  1. não possui conteúdo intrínseco Tamanho (por exemplo UIView)
  2. possui seu próprio conteúdo intrínseco Tamanho (por exemplo UIStackView)

Para uma exibição rolável verticalmente nos dois casos, você precisa adicionar estas restrições:

  1. 4 restrições da parte superior, esquerda, inferior e direita.

  2. Largura igual à visualização de rolagem (para interromper a rolagem horizontal)

Você não precisa de outras restrições para visualizações que tenham sua própria altura de conteúdo intrínseco.

insira a descrição da imagem aqui


Para visualizações que não possuem altura intrínseca de conteúdo, é necessário adicionar uma restrição de altura. A exibição rolará apenas se a restrição de altura for maior que a altura do scrollView.

insira a descrição da imagem aqui

Warif Akhand Rishi
fonte
2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Resultado:

insira a descrição da imagem aqui

iAj
fonte
por que você precisa do LeadAnchor quando você já o deixou?
ShadeToD
leftAnchor não pode ser utilizado para este fim, por isso temos de usar leadingAnchor para alcançar mesmo ..
IAJ
você usou os dois no seu exemplo.
ShadeToD 14/10/19
@ShadeToD deixe-me verificar
iAj 18/10/19
2

No meu caso, recebi a questão do tamanho do conteúdo incorreto e da ambiguidade do tamanho do conteúdo no iPad, mas estava funcionando no caso do iPhone. Fiz as seguintes alterações no storyboard para resolver o problema.

  1. Adicione a visualização de rolagem no UIView e adicione as restrições inicial, superior, final e inferior a 0,0,0,0.
  2. Defina a altura da visualização de rolagem conforme os requisitos para, por exemplo. 100
  3. Adicione UIView à exibição de rolagem e adicione restrições à esquerda, à direita, à direita e à direita para 0,0,0,0 e alinhe as restrições do centro (X) e do centro (Y).
  4. Desmarque "Guias de layout de conteúdo" no inspetor de tamanho da exibição de rolagem.
Daljeet Seera
fonte
1

Rolagem Vertical

  1. Adicione um UIScrollView com restrições 0,0,0,0 à superview.
  2. Adicione uma UIView no ScrollView, com restrições de 0,0,0,0 à superview.
  3. Adicione a mesma restrição de largura para o UIView no UIScrollView.
  4. Adicione altura ao UIView.
  5. Adicione elementos com restrições ao UIView.
  6. Para o elemento mais próximo da parte inferior, verifique se há uma restrição na parte inferior do UIView.
Bitcon
fonte
0

O que fiz foi criar uma exibição de conteúdo separada, como mostrado aqui.

A visualização de conteúdo é de forma livre e pode ter todas as subvisões adicionadas a ela com suas próprias restrições em relação ao contentView.

O UIScrollView é adicionado ao controlador de exibição principal.

Programaticamente, adiciono o contentView que está vinculado via IBOutlet à classe e defino o contentView do UIScrollView.

UIScrollView com ContentView via Interface Builder

Vlad
fonte
0

Eu estava recebendo o mesmo erro .. eu fiz o seguinte

  1. Vista (Superview)
  2. ScrollView 0,0,600,600
  3. UIView dentro do ScrollView: 0,0,600,600
  4. UIView contém visualização de imagem, etiqueta

Agora adicione à esquerda / à direita / superior / inferior para scrollView (2) e UIView (3).

Selecione View (1) e View (3) com a mesma altura e peso. Resolvi meu problema.

Eu fiz o vídeo que ajudará:

https://www.youtube.com/watch?v=s-CPN3xZS1A

Vinod Joshi
fonte
0

[testado no XCode 7.2 e no iOS 9.2]

O que suprimiu os erros e avisos do Storyboard para mim foi definir o tamanho intrínseco da exibição de rolagem e da exibição de conteúdo (no meu caso, uma exibição de pilha) como Placeholder . Essa configuração é encontrada no inspetor Tamanho no Storyboard. E diz - Definir um tamanho de conteúdo intrínseco para o tempo de design afeta apenas uma exibição durante a edição no Interface Builder. A visualização não terá esse tamanho de conteúdo intrínseco em tempo de execução.

Então, acho que não estamos errando ao definir isso.

Nota: No storyboard, fixei todas as bordas do scrollview na superview e todas as bordas do stackview no scrollview. No meu código, que eu pus os translatesAutoresizingMaskIntoConstraints como falsa, tanto para o scrollview eo stackview. E eu não mencionei um tamanho de conteúdo. Quando o stackview cresce dinamicamente, as restrições definidas no storyboard garantem que a pilha seja rolável.

O aviso do storyboard estava me deixando louco e eu não queria centralizar as coisas horizontal ou verticalmente apenas para suprimir o aviso.

gtl_pm
fonte
0

Se alguém está tendo um comportamento em que você percebe a barra de rolagem à direita, mas o conteúdo não se move, esse fato provavelmente vale a pena considerar:

Você também pode usar restrições entre o conteúdo da exibição de rolagem e os objetos fora da exibição de rolagem para fornecer uma posição fixa para o conteúdo da exibição de rolagem, fazendo com que esse conteúdo pareça flutuar sobre a exibição de rolagem.

Isso é da documentação da Apple . Por exemplo, se você fixou acidentalmente seu Label / Button / Img / View superior na exibição fora da área de rolagem (talvez um cabeçalho ou algo logo acima do scrollView?) Em vez do contentView, você congelaria todo o contentView no local.

Dave G
fonte
0

Conforme mencionado nas respostas anteriores, você deve adicionar uma visualização personalizada dentro da visualização de rolagem:

A visualização personalizada é o ContentView marcado na imagem

Adicione todas as suas subvisões à visualização de conteúdo. Em algum momento, você verá uma exibição de conteúdo de rolagem com aviso de tamanho de conteúdo ambíguo, selecione a exibição de conteúdo e clique no botão "Resolver problemas de layout automático" (no canto inferior direito do layout do IB) e selecione a opção "Adicionar ausente restrições ".

insira a descrição da imagem aqui

A partir de agora, quando você executar o projeto, a visualização de rolagem atualizará automaticamente seu tamanho de conteúdo, sem necessidade de código adicional.

supergegs
fonte
0

Você só precisa ter certeza de que há uma maneira de criar uma linha contínua de restrições de cima para baixo na visualização de rolagem. [-XXX]

No meu caso - uma exibição de rolagem de rolagem horizontal - eu também precisava adicionar restrições de largura e altura para cada filho da exibição de rolagem, embora a nota técnica da Apple não informe isso.

johnnyMac
fonte
0

Se você ainda tiver problemas com o UIScrollView, basta desativar os Guias de layout de conteúdo (selecione seu ScrollView no xcode Interface Builder -> escolha Inspetor de tamanho no painel direito -> desmarque 'Guias de layout de conteúdo') Ou tente estas etapas: xcode 11 layouts de exibição de rolagem - pode ser útil para o novo estilo de layout. Funciona bem no macOS 10.15.2, Xcode 11.3.1, para 05.02.2020

veja a captura de tela

Victor Doshenko
fonte
0

Usando o Autolayout

Adicione sua visualização de rolagem dentro de uma visualização bem definida e, em seguida, adicione a visualização de pilha dentro da visualização de rolagem

Adicione restrições superior, esquerda, direita, inferior, central X e Y central da exibição de rolagem e da pilha às super-visões relevantes

Verifique se as restrições estão vinculadas da visualização em pilha à superview correta (visualização em rolagem), pois a configuração padrão atual é adicionar uma restrição Alinhar à parte superior e não uma restrição ao espaço superior.

Ahmed Elashker
fonte