Gostaria de saber como usar essas propriedades da maneira correta.
Pelo que entendi, frame
pode ser usado no contêiner da exibição que estou criando. Ele define a posição da vista em relação à vista do contêiner. Ele também define o tamanho dessa exibição.
Também center
pode ser usado no contêiner da visualização que estou criando. Esta propriedade altera a posição da vista em relação ao seu contêiner.
Finalmente, bounds
é relativo à própria visualização. Altera a área de desenho para a vista.
Você pode dar mais informações sobre a relação entre frame
e bounds
? E as propriedades clipsToBounds
e masksToBounds
?
Respostas:
Como a pergunta que fiz foi vista muitas vezes, fornecerei uma resposta detalhada. Sinta-se à vontade para modificá-lo se desejar adicionar mais conteúdo correto.
Primeiro, uma recapitulação da questão: estrutura, limites e centro e o relacionamento deles.
Quadro A vista
frame
(CGRect
) é a posição do seu retângulo nosuperview
sistema de coordenadas da. Por padrão, ele começa no canto superior esquerdo.Limites As vistas
bounds
(CGRect
) expressam um retângulo de vista em seu próprio sistema de coordenadas.O centro A
center
éCGPoint
expresso em termos desuperview
sistema de coordenadas do e determina a posição do ponto central exato da vista.Retirados da posição do UIView +, esses são os relacionamentos (eles não funcionam no código, pois são equações informais) entre as propriedades anteriores:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
NOTA: Esses relacionamentos não se aplicam se as vistas forem giradas. Para mais informações, sugiro que você dê uma olhada na imagem a seguir, tirada de The Kitchen Drawer, com base no curso Stanford CS193p . Os créditos vão para @Rhubarb .
Usar o
frame
permite reposicionar e / ou redimensionar uma vista dentro delasuperview
. Geralmente, pode ser usado a partir desuperview
, por exemplo, quando você cria uma subvisão específica. Por exemplo:Quando você precisa das coordenadas para desenhar dentro de um,
view
você costuma se referirbounds
. Um exemplo típico pode ser desenhar dentro deview
uma subvisão como uma inserção da primeira. Para desenhar a subvisão, é necessário conhecerbounds
a supervisão. Por exemplo:Comportamentos diferentes acontecem quando você altera o modo
bounds
de exibição. Por exemplo, se você alterarbounds
size
, asframe
alterações (e vice-versa). A mudança acontece em tornocenter
da vista. Use o código abaixo e veja o que acontece:Além disso, se você alterar,
bounds
origin
altere oorigin
sistema de coordenadas interno. Por padrão,origin
está em(0.0, 0.0)
(canto superior esquerdo). Por exemplo, se você alterar oorigin
para,view1
poderá ver (comente o código anterior, se desejar) que agora o canto superior esquerdoview2
toca noview1
. A motivação é bastante simples. Você diz paraview1
que seu topo canto esquerdo agora está na posição(20.0, 20.0)
mas desdeview2
'sframe
origin
começa a partir(20.0, 20.0)
, eles vão coincidir.O
origin
representa aview
posição do dentro dele,superview
mas descreve a posição dobounds
centro.Finalmente,
bounds
eorigin
não são conceitos relacionados. Ambos permitem derivar aframe
vista (Veja as equações anteriores).Estudo de caso de View1
Aqui está o que acontece ao usar o seguinte snippet.
A imagem relativa.
Em vez disso, o que acontece se eu mudar os
[self view]
limites da seguinte forma.A imagem relativa.
Aqui você diz
[self view]
que seu canto superior esquerdo está agora na posição (30.0, 20.0), mas comoview1
a origem do quadro começa em (30.0, 20.0), eles coincidirão.Referências adicionais (para atualizar com outras referências, se desejar)
Sobre
clipsToBounds
(fonte Apple doc)Em outras palavras, se uma visualização
frame
é(0, 0, 100, 100)
e sua subvisão é(90, 90, 30, 30)
, você verá apenas uma parte dessa subvisualização. Este último não excederá os limites da visualização principal.masksToBounds
é equivalente aclipsToBounds
. Em vez de aUIView
, essa propriedade é aplicada a aCALayer
. Sob o capô,clipsToBounds
chamamasksToBounds
. Para referências adicionais, consulte Como está a relação entre clipsToBounds do UIView e masksToBounds do CALayer? .fonte
Esta pergunta já tem uma boa resposta, mas quero complementá-la com mais algumas fotos. Minha resposta completa está aqui.
Para me ajudar a lembrar da moldura , penso em uma moldura na parede . Assim como uma imagem pode ser movida para qualquer lugar da parede, o sistema de coordenadas do quadro de uma vista é a superview. (parede = super visão, quadro = visão)
Para me ajudar a lembrar dos limites , penso nos limites de uma quadra de basquete . A bola de basquete está em algum lugar dentro da quadra, assim como o sistema de coordenadas dos limites da vista está dentro da própria vista. (quadra = exibição, basquete / jogadores = conteúdo dentro da exibição)
Como o quadro, view.center também está nas coordenadas da superview.
Quadro vs limites - Exemplo 1
O retângulo amarelo representa o quadro da vista. O retângulo verde representa os limites da vista. O ponto vermelho nas duas imagens representa a origem do quadro ou limites dentro de seus sistemas de coordenadas.
Exemplo 2
Exemplo 3
Exemplo 4
É o mesmo que no exemplo 2, exceto que, desta vez, todo o conteúdo da exibição é mostrado como seria se não estivesse cortado nos limites da exibição.
Exemplo 5
Mais uma vez, veja aqui a minha resposta com mais detalhes.
fonte
Achei esta imagem mais útil para entender quadro, limites etc.
Observe também que
frame.size != bounds.size
quando a imagem é girada.fonte
Eu acho que se você pensa do ponto de vista
CALayer
, tudo fica mais claro.O quadro não é realmente uma propriedade distinta da vista ou da camada, é uma propriedade virtual, calculada a partir dos limites, da posição (
UIView
centro) e da transformação.Então, basicamente, como os layouts de camada / exibição são realmente decididos por essas três propriedades (e pelo anchorPoint), e qualquer uma dessas três propriedades não altera nenhuma outra propriedade, como alterar a transformação não altera os limites.
fonte
Existem respostas muito boas com explicações detalhadas para este post. Eu apenas gostaria de referir que não há outra explicação com uma representação visual para o significado de Frame, Bounds, Centro, Transform, Bounds origem na WWDC 2011 Vídeo Compreender UIKit Rendering a partir de @ 4: 22 até 20:10
fonte
Depois de ler as respostas acima, aqui adicionando minhas interpretações.
Suponha que navegando on-line, o navegador da web seja o seu
frame
que decida onde e qual o tamanho da página da web. O navegador do navegador é o seubounds.origin
que decide qual parte da página da web será exibida.bounds.origin
é difícil de entender. A melhor maneira de aprender é criar o Aplicativo de exibição única, tentando modificar esses parâmetros e ver como as subvisões mudam.fonte