UIView
tem as propriedades frame
, bounds
, center
, e origin
, e todos eles parecem estar inter-relacionados. Na maioria das vezes, trato frame
ao definir a posição e o tamanho de a UIView
. Eu entendo que frame
está usando o sistema de coordenadas global e bounds
está usando coordenadas da exibição local (portanto, x e y são 0, mas nem sempre), mas ainda me confunde quando usar o quê.
Em que contexto (e qual é o momento certo) as outras propriedades ( bounds
, center
, origin
) deve ser usado?
Respostas:
A resposta de Marco acima está correta, mas apenas para expandir a questão de "em que contexto" ...
frame - essa é a propriedade que você costuma usar para aplicativos normais do iPhone. a maioria dos controles será organizada em relação ao controle "contendo", para que o frame.origin corresponda diretamente ao local em que o controle precisa ser exibido e o frame.size determinará o tamanho do controle.
center - essa é a propriedade na qual você provavelmente se concentrará em jogos e animações baseados em sprites em que movimentos ou redimensionamentos possam ocorrer. Por padrão, a animação e a rotação serão baseadas no centro do UIView. Raramente faz sentido tentar gerenciar esses objetos pela propriedade frame.
limites - essa propriedade não é uma propriedade de posicionamento, mas define a área de desenho do UIView "relativa" ao quadro. Por padrão, essa propriedade geralmente é (0, 0, largura , altura ). Alterar essa propriedade permitirá desenhar fora do quadro ou restringir o desenho a uma área menor dentro do quadro. Uma boa discussão sobre isso pode ser encontrada no link abaixo. É incomum que essa propriedade seja manipulada, a menos que haja uma necessidade específica de ajustar a região do desenho. A única exceção é que a maioria dos programas usa a
[[UIScreen mainScreen] bounds]
inicialização para determinar a área visível para o aplicativo e configurar o quadro do UIView inicial de acordo.Por que existe um retângulo de quadro e um retângulo de limites em um UIView?
Espero que isso ajude a esclarecer as circunstâncias em que cada propriedade pode ser usada.
fonte
bounds
são comumente usados quando uma exibição tem uma transformação aplicada a ela. Nessas circunstâncias, aframe
propriedade é indefinida. Conforme indicado por outras respostas, modificar ocenter
ebounds
é equivalente a modificar a posição e o tamanho da vista, respectivamente.Eles são valores relacionados e mantidos consistentes pelos métodos setter / getter de propriedades (e usando o fato de que o quadro é um valor puramente sintetizado, não suportado por uma variável de instância real).
As principais equações são:
(que é igual a)
(e há também)
Isso não é código, apenas equações para expressar a invariante entre as três propriedades. Essas equações também assumem que a transformação da sua visualização é a identidade, que é por padrão. Caso contrário, os limites e o centro mantêm o mesmo significado, mas o quadro pode mudar. A menos que você esteja fazendo rotações em ângulo não reto, o quadro sempre será a vista transformada em termos das coordenadas da superview.
Tudo isso é explicado em mais detalhes com uma mini-biblioteca útil aqui:
http://bynomial.com/blog/?p=24
fonte
As propriedades
center
,bounds
eframe
estão interligados: mudando um vai atualizar os outros, portanto, usá-los como quiser. Por exemplo, em vez de modificar os parâmetros x / y deframe
uma exibição mais recente, basta atualizar acenter
propriedade.fonte