UIScrollView não rolando

Eu tenho um UIScrollView que contém muitos UIImageView s, UILabels, etc … os labels são muito mais do que o UIScrollView , mas quando eu executar o aplicativo, eu não posso clicar e rolar para baixo …

Por que isso pode ser?

obrigado

    É sempre bom mostrar um snippet de código de trabalho completo:

     // in viewDidLoad (if using Autolayout check note below): UIScrollView *myScrollView; UIView *contentView; // scrollview won't scroll unless content size explicitly set [myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size 

    Swift 4.0

     let myScrollView let contentView // scrollview won't scroll unless content size explicitly set myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size //sets ScrollView content size 

    Eu não encontrei uma maneira de definir o contentSize no IB (a partir do Xcode 5.0) .

    Nota: Se você estiver usando o Autolayout, o melhor lugar para colocar esse código é dentro do método -(void)viewDidLayoutSubviews .

    Se você não conseguir rolar a visualização mesmo depois de definir corretamente o contentSize , desmarque a opção “Usar AutoLayout” no Interface Builder -> File Inspector.

    Você precisa definir a propriedade contentSize da exibição de rolagem para que ela role adequadamente.

    Se você estiver usando o autolayout, precisará definir contentSize em viewDidLayoutSubviews para que ele seja aplicado depois que o autolayout for concluído.

    O código poderia ser assim:

     -(void)viewDidLayoutSubviews { // The scrollview needs to know the content size for it to work correctly self.scrollView.contentSize = CGSizeMake( self.scrollContent.frame.size.width, self.scrollContent.frame.size.height + 300 ); } 

    A resposta acima está correta – para fazer a rolagem acontecer, é necessário definir o tamanho do conteúdo.

    Se você estiver usando o construtor de interfaces, uma maneira simples de fazer isso é com os atributos de tempo de execução definidos pelo usuário. Por exemplo:

    insira a descrição da imagem aqui

    Tente resize o tamanho do conteúdo para números enormes. Não consegui entender por que minha visualização de rolagem não rola mesmo quando o tamanho do conteúdo parece ser maior que o tamanho do controle. Descobri que, se o tamanho do conteúdo é menor que o necessário, ele também não funciona.

     self.scrollView.contentSize = CGSizeMake(2000, 2000); 

    Em vez de 2000 você pode colocar seus próprios números grandes. E se funcionar, significa que o tamanho do seu conteúdo não é grande o suficiente quando você redimensiona.

    O delegado não é necessário para a exibição de rolagem funcionar.

    Certifique-se de ter a propriedade contentSize da exibição de rolagem definida como o tamanho correto (ou seja, uma grande o suficiente para abranger todo o seu conteúdo).

    Desmarque a opção “Usar o Autolayout” para mim.

    Ambiente: xCode 5.0.2 Storyboards ios7

    No meu caso, tive que definir delaysContentTouches como true porque os objects dentro do scrollView estavam todos capturando os events de toque e manipulando a si mesmos, em vez de permitir que o próprio scrollView o manipulasse.

    A ideia de por que a exibição de rolagem não está rolando porque você definiu o tamanho do conteúdo para rolar menos do que o tamanho da exibição de rolagem, o que está errado. Você deve definir o tamanho do conteúdo maior que o tamanho da sua visualização de rolagem para navegar por ele durante a rolagem.

    A mesma idéia com o zoom, você define o valor mínimo e máximo para o zoom que será aplicado através da ação de zoom.

    bem vinda 🙂

    Um pequeno acréscimo, todos acima, são as verdadeiras razões pelas quais sua visualização de rolagem pode não estar rolando, mas algumas vezes isso pode ser a razão pela qual o scrollview é adicionado através do código e não do IB, você pode ter adicionado suas subvisualizações à visualização pai e não a vista de rolagem faz com que a subvisão não role

    e manter o tamanho do conteúdo definido e maior que o frame de visualização pai (duhh !!)

    Defina a propriedade contentSize do UIScrollview no método ViewDidLayoutSubviews . Algo assim

     override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height) } 

    se você estiver recebendo uma mensagem (IOS8 / swift) que viewDidLayoutSubviews não existe, use o seguinte ao invés

     override func viewDidAppear(animated: Bool) 

    Isso consertou para mim

    Algo que não foi mencionado antes!

    Verifique se a sua tomada foi conectada corretamente ao scrollView! Ele deve ter um círculo preenchido, mas mesmo se você tiver preenchido o círculo, scrollView pode não estar conectado – então verifique novamente! Passe o mouse sobre o círculo e veja se a rolagem real fica destacada! (Este foi um caso para mim)

     //Connect below well to the scrollView in the storyBoard @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 

    Muitas vezes o código está correto se você seguiu um tutorial, mas o que muitos iniciantes não sabem é que o scrollView NÃO irá rolar normalmente pelo simulador. É suposto rolar apenas quando você pressiona o mousepad e rola simultaneamente. Muitos usuários experientes do XCode / Swift / Obj-C estão tão acostumados a fazer isso e, portanto, não sabem como poderia ser ignorado pelos iniciantes. Tchau 🙂

     @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() view.addSubview(scrollView) // Do any additional setup after the view } override func viewWillLayoutSubviews(){ super.viewWillLayoutSubviews() scrollView.contentSize = CGSize(width: 375, height: 800) } 

    Este código funcionará perfeitamente bem desde que você faça o que eu disse acima

    Se nenhuma das outras soluções funcionar para você, verifique se a sua visualização de rolagem é realmente um UIScrollView no Interface Builder.

    Em algum momento nos últimos dias, meu UIScrollView mudou espontaneamente o tipo para um UIView , mesmo que sua class dissesse UIScrollView no inspetor. Estou usando o Xcode 5.1 (5B130a) .

    Você pode criar uma nova visualização de rolagem e copiar as medidas, configurações e restrições da exibição antiga ou pode alterar manualmente sua exibição para um UIScrollView no arquivo xib . Eu fiz uma comparação e encontrei as seguintes diferenças:

    Original:

      ...  

    Após o tipo alterado espontaneamente:

      ...  

    Então substituí a linha por minha linha .

    Eu também substituí a tag de fechamento da view por .

    Certifique-se de manter o id igual ao atual, neste caso: id = “qRn-TP-cXd”.

    Eu também tive que liberar o xib do cache do Xcode, excluindo os dados derivados do aplicativo:

    • Xcode->Window->Organizer->Projects , escolha o seu projeto, na linha Derived Data, clique em Delete …

    Ou se estiver usando um dispositivo:

    • Xcode->Window->Organizer->Device , escolha o seu dispositivo-> Aplicações, escolha a sua aplicação, clique em (-)

    Agora limpe o projeto e remova o aplicativo do simulador / dispositivo:

    • Xcode->Product->Clean
    • iOS Simulator/device->press e segure o app->click no (X) para removê-lo

    Você deve, então, ser capaz de criar e executar seu aplicativo e ter a funcionalidade de rolagem novamente.

    PS Não viewDidLayoutSubviews definir o tamanho do conteúdo da visualização de rolagem em viewDidLayoutSubviews ou desativar o layout automático, mas YMMV.

    Se seu scrollView é uma scrollView de um containerView de algum tipo, então certifique-se de que seu scrollView esteja dentro do frame ou dos limites do containerView . Eu tinha containerView.clipsToBounds = NO que ainda me permitia ver o scrollView, mas como o scrollView não estava dentro dos limites do containerView ele não detectava events de toque.

    Por exemplo:

     containerView.frame = CGRectMake(0, 0, 200, 200); scrollView.frame = CGRectMake(0, 200, 200, 200); [containerView addSubview:scrollView]; scrollView.userInteractionEnabled = YES; 

    Você poderá ver o scrollView, mas ele não receberá interações do usuário.

    adicionando o código a seguir em viewDidLayoutSubviews funcionou para mim com o Autolayout. Depois de tentar todas as respostas:

     - (void)viewDidLayoutSubviews { self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620); } //set the height of content size as required 

    Adicione o UIScrollViewDelegate e adicione o seguinte código ao método viewDidAppear para mim.

     @interface testScrollViewController ()  -(void)viewDidAppear:(BOOL)animated { self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; self.scrollView.contentSize = CGSizeMake(375, 800); } 

    Depois de falhar com as respostas fornecidas neste tópico, me deparei com este artigo com a solução.

    Há duas coisas que não são intuitivas sobre como configurar o scrollview com o autolayout:

    1. As restrições que você configura como margin entre o contentview e o scrollview não influenciam o tamanho do contentview. Eles realmente são margens. E para que isso funcione, o contentview deve ter um tamanho fixo.
    2. O truque para o tamanho fixo é que você pode definir a largura do contentview igual à do pai da visão de rolagem. Basta selecionar ambas as visualizações na tree à esquerda e adicionar a restrição de larguras iguais.

    Esta é a essência desse artigo. Para uma explicação completa, incluindo ilustrações, confira.

    Eu fiz isso funcionar na minha primeira tentativa. Com layout automático e tudo, sem código adicional. Em seguida, uma exibição de coleção foi banana, travando em tempo de execução, não consegui encontrar o que estava errado, então excluí e recriou (estou usando o Xcode 10 Beta 4. Parecia um bug) e a rolagem desapareceu. A visualização da coleção funcionou novamente, embora!

    Muitas horas depois … isso é o que consertou para mim. Eu tinha o seguinte layout:

    UIView

    • Área segura
    • Vista de rolagem
      • Visualização de conteúdo

    Está tudo nas restrições. Área Segura é definida automaticamente pelo sistema. No pior dos casos, remova todas as restrições para exibições de rolagem e de conteúdo e não faça com que o IB seja redefinido / criado para você. Faça-os manualmente, funciona.

    • Para o modo de rolagem, eu fiz: Align Trailing / Top to Safe Area. Largura / altura igual à área segura .
    • Para a visualização Content eu fiz: Align Trailing / Leading / Superior / Inferior para Superview (a visualização de rolagem)

    Basicamente, o conceito é ter a visualização de conteúdo ajustando Scrollview, que é uma área segura.

    Mas, como tal, não funcionou. A visualização de conteúdo perdeu a altura. Eu tentei tudo o que pude e o único a fazer o truque foi uma visualização de conteúdo arrastada por controle de altura do Content view .. para si mesma . Isso definiu uma altura fixa, cujo valor foi calculado a partir do Tamanho do controlador de visualização (definido como freeform, mais longo que o display real, para conter todas as minhas subvisualizações) e finalmente funcionou de novo!

    Eu descobri que com esse problema de AutoLayout … se eu apenas fizer o ViewController usar o UIView invés do UIScrollView para a class … então apenas adicione um UIScrollView mim mesmo … que ele funciona.