Redimensionando máscaras programaticamente versus Interface Builder / xib / nib

216

Eu estava em uma suposição (provavelmente falsa) de que ativar o indicador de margem certa no xib é equivalente a usar UIViewAutoresizingFlexibleLeftMargincódigo interno e assim por diante.

Então, eu costumava pensar de acordo com este instantâneo: insira a descrição da imagem aqui

Mais tarde, hoje, tive que fazer uma verificação cruzada e me deparei com esse tópico .

E também a documentação da apple, intitulada com a seção com o título - "Manipulando alterações de layout automaticamente usando regras de redimensionamento automático" neste link: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Portanto, agora tenho em mente um conceito renovado sobre como definir máscaras de redimensionamento automático programaticamente seria equivalente às configurações do xib:

Cenário 1 : configuração apenas (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)é equivalente a:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

No XIB?

Cenário 2 : a configuração (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)no código é equivalente a:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

No XIB?

Meus 2 cenários renovados estão corretos? Estou agora no meu entendimento?

Raj Pawan Gumdal
fonte
3
Você esta brincando comigo? Mas parece haver também onde está minha confusão. Então, se eu quero abraçar o topo, ligo o fundo automaticamente. Bom trabalho apple. Esta é a configuração mais idiota que eu já vi.
user4951
1
Se você deseja abraçar o topo, certifique-se de não mencionar UIViewAutoresizingFlexibleTopMargin no código da máscara de bits. Minha suposição anterior estava errada e é por isso que eu havia postado essa pergunta para esclarecer as coisas.
Raj Pawan Gumdal
Sua suposição está correta. Onde você está errado?
user4951
Sim, os dois cenários citados estão corretos.
3
Eu fiz uma ferramenta simples para isso: erkanyildiz.me/lab/autoresizingmask você pode usá-lo.
Erkanyildiz 07/07/19

Respostas:

35

Sim, o Interface Builder "inverteu" em um sentido (ou UIView, dependendo de como você o vê). Seus "cenários" citados estão corretos.

DarkDust
fonte
47

Sim, você citou as coisas corretamente. Além disso, concordo que parece um pouco atrasado, por isso, agradeço sua postagem.

Você pode gostar de usar uma macro de pré-processador UIViewAutoresizingFlexibleMarginsao tornar a margem de um UIView flexível em todas as direções. Coloquei isso no arquivo de cabeçalho pré-compilado para que seja incluído em todos os lugares.

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

O uso UIViewAutoresizingFlexibleMarginsfará com que um elemento da interface do usuário permaneça centralizado, pois NÃO estará abraçando nenhum dos lados. Para fazer o elemento aumentar / diminuir com o pai, defina o UIViewAutoresizingFlexibleWidthe UIViewAutoresizingFlexibleHeightrespectivamente.

Eu gosto de usar, UIViewAutoresizingFlexibleMarginsporque depois eu posso fazer referência a ele como

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

ao invés de

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Com frequência, vejo essas margens OU juntas em uma linha, como no exemplo acima. Apenas difícil de ler.

Sam
fonte
4
Flexível em todas as direções deve ser (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight), eu acho? Ou estou confuso de novo!
Raj Pawan Gumdal 19/10/11
4
O FlexibleMargins fará com que o elemento permaneça centralizado (sem envolver a margem esquerda, superior, direita ou inferior). Largura / altura flexíveis farão com que o elemento da interface do usuário cresça / encolha, respectivamente.
Sam
4
Está tudo claro agora? Além disso, eu realmente quis dizer isso quando disse que apreciei o seu post. Na verdade, eu o favoreci porque isso me confundiu no passado. Eu acho que é um ótimo Q.
Sam
3
Sim, obrigado, agora entendi "Margens flexíveis" e "Largura / altura flexíveis". Isso explica tudo, e seu "não abraçando a, superior, direita ou à margem inferior esquerda" é uma boa maneira de explicar :)
Raj Pawan Gumdal
0

insira a descrição da imagem aqui

A ativação da seta vertical / horizontal (chamada mola) dentro da caixa tornará a altura / largura flexível. Mas ativar uma linha externa (chamada suporte) tornará esse lado inflexível / não flexível.

Ativar a linha esquerda externa (suporte esquerdo) não é equivalente a ativar UIViewAutoresizingFlexibleRightMargin. Em vez disso, UIViewAutoresizingFlexibleRightMargin= em caso de braço direito desativada, off se de braço direito habilitado.

É bastante confuso no começo, mas se você observar de perto, há uma diferença nas molas e nos suportes. Não sei por que a Apple fez isso, mas para mim, houve alguns casos em que era mais fácil de usar. E usar propriedades opostas no código é ainda mais confuso.

Abdurrahman Mubeen Ali
fonte
0

Swift 4 usa isso

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Objetivo-C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Muhammad Nayab
fonte