Eu tenho uma visão que precisa ter seu quadro manipulado programaticamente - é um tipo de visão de documento que envolve seu conteúdo, que é então rolado e ampliado ao redor de uma super visão manipulando a origem do quadro. Autolayout luta com isso em tempo de execução.
Desativar o autolayout completamente parece um pouco difícil porque poderia ser razoavelmente usado para lidar com o layout das outras visualizações. Parece que o que eu quero é algum tipo de "restrição nula".
fonte
Eu tive um problema semelhante onde o Autolayout estava substituindo algumas das minhas configurações de quadro em tempo de execução (eu tinha uma visão dinâmica que, em alguns casos, empurrava um novo controlador de visão ... apertar e depois pressionar Voltar redefinia a visão inicial).
Eu contornei isso colocando meu código de manipulação no
viewDidLayoutSubviews
meu View Controller. Parece ser chamado depois de qualquer restrição que o mojo seja chamado, mas antes de viewDidAppear, de modo que o usuário não percebe.fonte
Talvez apenas definir
translatesAutoresizingMaskIntoConstraints
comoYES
(e não adicionar restrições adicionais que afetam essa visualização) permitirá que você defina o quadro sem lutar contra o sistema de layout automático.fonte
No iOS 8, você pode definir um NSLayoutConstraint para estar ativo ou não. Portanto, se estou usando o construtor de interface, adiciono todas as minhas restrições a um OutletCollection e, em seguida, ativo ou desativo usando:
O aplicativo específico para o qual estou usando aqui está tendo diferentes restrições no modo retrato e paisagem e eu ativo / desativo com base na rotação do dispositivo. Isso significa que posso criar algumas alterações de layout complexas no construtor de interface para ambas as orientações e ainda usar o layout automático sem o código de layout automático detalhado.
Ou você pode ativar / desativar usando removeConstraints e addConstraints.
fonte
Não sei se isso vai ajudar mais alguém, mas escrevi uma categoria para tornar isso conveniente porque me pego fazendo muito isso.
UIView + DisableAutolayoutTemporously.h
UIView + DisableAutolayoutTemporously.m
Eu uso assim:
Espero que ajude.
fonte
Você pode definir o
translatesAutoresizingMaskIntoConstraints
tipoBoolean
, Valor Sim nos Atributos de tempo de execução definidos pelo usuário do UIView que deseja no xib / storyboard.fonte
Você pode dividir em vários storyboards se quiser usar o layout automático para algumas visualizações.
fonte
Para mim, funcionou criar a subvisualização programaticamente; no meu caso, o layout automático estava bagunçando uma visão que eu precisava girar em torno de seu centro, mas depois que criei essa visão programaticamente, ela funcionou.
fonte
Na minha opinião, eu tinha um rótulo e um texto. O rótulo tinha gesto de pan. O rótulo se move bem durante o arrasto. Mas quando eu uso o teclado de caixa de texto, o rótulo redefine sua posição para o local original definido no layout automático. O problema foi resolvido quando adicionei o seguinte rapidamente para o rótulo. Eu adicionei isso em viewWillAppear, mas pode ser adicionado em qualquer lugar onde você tenha acesso ao campo de destino.
fonte
Isso aconteceu comigo em um projeto sem storyboards ou arquivos xib. Todo o código 100%. Eu tinha um banner de anúncio na parte inferior e queria que os limites de visualização parassem no banner de anúncio. A visualização seria redimensionada automaticamente após o carregamento. Tentei todas as resoluções desta página, mas nenhuma funcionou.
Acabei criando apenas uma visualização secundária com a altura reduzida e coloquei-a na visualização principal do controlador. Então, todo o meu conteúdo foi para a sub view. Isso resolveu o problema facilmente, sem fazer nada que parecesse ir contra a corrente.
Eu estou pensando se você quer uma visão que não seja do tamanho normal que preenche a janela, então você deveria usar uma visão secundária para isso.
fonte
Encontrei um cenário semelhante, onde me juntei a um projeto que foi iniciado com layout automático, mas precisei fazer ajustes dinâmicos em várias visualizações. Aqui está o que funcionou para mim:
NÃO tenha visualizações ou componentes dispostos no construtor de interface.
Adicione suas visualizações de forma puramente programática, começando com aloc / init e configurando seus quadros de maneira apropriada.
Feito.
fonte
Em vez de desativar o autolayout, eu apenas calcularia a nova restrição com o quadro que você está substituindo. Essa parece-me a forma adequada. Se você estiver ajustando componentes que dependem de restrições, ajuste-os de acordo.
Por exemplo, se você tem uma restrição vertical de 0 entre duas visualizações (myView e otherView) e tem um gesto panorâmico ou algo que ajusta a altura de myView, você pode recalcular a restrição com os valores ajustados.
fonte
Para aqueles de vocês que estão usando o layout automático, confira minha solução aqui . Você deve fazer
@IBOutlet
as restrições que deseja ajustar e, em seguida, alterar suas constantes.fonte
se for um arquivo xib:
fonte