Posso desabilitar o autolayout para uma subvisão específica em tempo de execução?

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 em torno de uma super visão, manipulando a origem do quadro. O autolayout luta contra isso em tempo de execução.

Desativar completamente o autolayout parece um pouco difícil, pois pode ser usado para manipular o layout das outras visualizações. Parece que o que eu posso querer é algum tipo de “restrição nula”.

    Eu tive o mesmo problema. Mas eu resolvi isso.
    Sim, você pode desabilitar o layout automático em tempo de execução para um UIView específico, em vez de desabilitá-lo para todo o xib ou storyboard que é definido por padrão no Xcode 4.3 e posterior.

    Defina translatesAutoresizingMaskIntoConstraints para YES , antes de definir o quadro da sua subvisualização:

     self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; self.exampleView.frame = CGRectMake(20, 20, 50, 50); 

    Eu tive um problema semelhante onde o Autolayout estava substituindo alguns dos meus frameworks em tempo de execução (eu tinha uma visão dinâmica que, em alguns casos, empurrava um novo controlador de visão … pressionar e pressionar Voltar redefiniria a exibição inicial).

    Passei por isso colocando meu código de manipulação em viewDidLayoutSubviews do meu View Controller. Isso parece ser chamado após qualquer mojo de restrição ser chamado, mas antes de viewDidAppear, então o usuário não é o mais sábio.

    Talvez apenas definir translatesAutoresizingMaskIntoConstraints para YES (e não adicionar restrições adicionais afetando essa visualização) permitirá definir o quadro sem combater o sistema de layout automático.

    No iOS 8, você pode definir um NSLayoutConstraint como ativo ou não. Então, se estou usando o construtor de interfaces, adiciono todas as minhas restrições a um OutletCollection e, em seguida, ative ou desative usando:

     NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad) NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad) 

    O aplicativo específico que estou usando para isso é ter restrições diferentes no modo retrato e paisagem e ativar / desativar 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.

    Não sei se isso ajudará a mais ninguém, mas escrevi uma categoria para tornar isso conveniente porque me vejo fazendo muito isso.

    UIView + DisableAutolayoutTemporarily.h

     #import  @interface UIView (DisableAutolayoutTemporarily) // the view as a parameter is a convenience so we don't have to always // guard against strong-reference cycles - (void)resizeWithBlock:(void (^)(UIView *view))block; @end 

    UIView + DisableAutolayoutTemporarily.m

     #import "UIView+DisableAutoResizeTemporarily.h" @implementation UIView (DisableAutoResizeTemporarily) - (void)resizeWithBlock:(void (^)(UIView * view))block { UIView *superview = self.superview; [self removeFromSuperview]; [self setTranslatesAutoresizingMaskIntoConstraints:YES]; __weak UIView *weakSelf = self; block(weakSelf); [superview addSubview:self]; } @end 

    Eu uso assim:

     [cell.argumentLabel resizeWithBlock:^(UIView *view) { [view setFrame:frame]; }]; 

    Espero que ajude.

    Você pode definir o tipo de translatesAutoresizingMaskIntoConstraints Boolean , Value Yes nos Atributos de Tempo de Execução Definidos pelo Usuário do UIView que você deseja no xib / storyboard.

    • Abrir projeto em 4.5
    • Selecione o storyboard
    • Abra o inspetor de arquivos
    • Em Documento do Construtor de Interface, desmarque a opção “Usar o Autolayout”

    Você pode dividir vários storyboards se quiser usar o autolayout para algumas exibições.

    Para mim, trabalhou para criar a subvisualização programaticamente, no meu caso, o layout automático estava mexendo com uma visão que eu precisava para girar em torno de seu centro, mas uma vez que eu criei essa visão programaticamente funcionou.

    Na minha opinião eu tinha um label e um texto. O label tinha um gesto de pan. O label se move bem durante o arrasto. Mas quando uso o teclado da checkbox de texto, o label redefine sua posição para o local original definido no layout automático. O problema foi resolvido quando adicionei o seguinte em swift para o marcador. Eu adicionei isso no viewWillAppear, mas ele pode ser adicionado praticamente em qualquer lugar que você tenha access ao campo de destino.

     self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true 

    Isso aconteceu comigo em um projeto sem storyboards ou arquivos xib. Todo o código de 100%. Eu tinha um banner de anúncio na parte inferior e queria que os limites de exibição parassem no banner do anúncio. A vista se resizeia automaticamente após o carregamento. Eu tentei todas as resoluções nesta página, mas nenhuma delas funcionou.

    Acabei criando apenas uma sub visão com a altura reduzida e coloquei isso na visão principal do controlador. Então todo o meu conteúdo foi para a sub visão. Isso resolveu o problema com muita facilidade, sem fazer nada que parecia estar indo contra a corrente.

    Eu estou pensando se você quiser uma visão que não é o tamanho normal que preenche a janela, então você deve usar uma sub visão para isso.

    Eu encontrei um cenário semelhante, onde entrei em um projeto que foi iniciado com layout automático, mas precisei fazer ajustes dynamics em várias visualizações. Aqui está o que funcionou para mim:

    1. NÃO tenha visualizações ou componentes dispostos no construtor de interface.

    2. Adicione suas visualizações de forma puramente programática, iniciando com alocação / boot e definindo seus frameworks apropriadamente.

    3. Feito.

    Em vez de desabilitar o autolayout, gostaria de calcular a nova restrição com o quadro que você está substituindo. Isso parece-me ser o caminho apropriado. Se você estiver ajustando componentes que dependem de restrições, ajuste-os de acordo.

    Por exemplo, se você tiver uma restrição vertical de 0 entre duas visualizações (myView e otherView) e tiver um gesto de panorâmica ou algo que ajuste a altura de myView, poderá recalcular a restrição com os valores ajustados.

     self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height); [self.myView needsUpdateConstraints]; 

    Para aqueles de vocês que estão usando o layout automático, confira minha solução aqui . Você deve fazer o @IBOutlet das restrições que deseja ajustar e depois alterar suas constantes.

    se for arquivo xib:

    1. selecione o arquivo .xib
    2. selecione o “Proprietário do Arquivo”
    3. mostre os utilitários
    4. clique em: “File Inspector”
    5. Em “Interface Builder Document” desativar: “Use Autolayout”