Quadro, limites, centro, origem do UIView, quando usar o quê?

195

UIViewtem as propriedades frame, bounds, center, e origin, e todos eles parecem estar inter-relacionados. Na maioria das vezes, trato frameao definir a posição e o tamanho de a UIView. Eu entendo que frameestá usando o sistema de coordenadas global e boundsestá 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?

Boon
fonte
O link abaixo tem a melhor resposta. stackoverflow.com/questions/5361369/…
Ohmy
Quadro vs Bounds com imagens: stackoverflow.com/a/28917673/3681880
Suragch

Respostas:

240

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.

Barney Mattox
fonte
33
Eu acho que vale a pena acrescentar que eles boundssão comumente usados ​​quando uma exibição tem uma transformação aplicada a ela. Nessas circunstâncias, a framepropriedade é indefinida. Conforme indicado por outras respostas, modificar o centere boundsé equivalente a modificar a posição e o tamanho da vista, respectivamente.
Stuart
36

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:

frame.origin = center - bounds.size / 2

(que é igual a)

center = frame.origin + bounds.size / 2

(e há também)

frame.size = bounds.size

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

Tyler
fonte
18

As propriedades center, boundse frameestão interligados: mudando um vai atualizar os outros, portanto, usá-los como quiser. Por exemplo, em vez de modificar os parâmetros x / y de frameuma exibição mais recente, basta atualizar a centerpropriedade.

Marco Mustapic
fonte