Eu quero alterar o anchorPoint
, mas manter a visão no mesmo lugar. Eu tentei NSLog
-ing self.layer.position
e self.center
eles permanecem os mesmos, independentemente das alterações no anchorPoint. No entanto, minha visão se move!
Alguma dica sobre como fazer isso?
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
A saída é:
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
fonte
anchorPoint
eposition
estão relacionados juntos?Eu tive o mesmo problema. A solução de Brad Larson funcionou muito bem, mesmo quando a vista é girada. Aqui está sua solução traduzida em código.
E o equivalente rápido:
fonte
A chave para resolver isso foi usar a propriedade frame, que é estranhamente a única coisa que muda.
Swift 2
Swift 3
Depois, redimensiono, onde ele escala do anchorPoint. Então eu tenho que restaurar o antigo anchorPoint;
Swift 2
Swift 3
EDIT: isso aparece se a vista for girada, pois a propriedade frame não é definida se uma CGAffineTransform tiver sido aplicada.
fonte
Para mim, era mais fácil entender
position
eanchorPoint
quando comecei a compará-lo com meu entendimento de frame.origin no UIView. Uma UIView com frame.origin = (20,30) significa que a UIView está a 20 pontos da esquerda e a 30 pontos da parte superior da visualização pai. Esta distância é calculada a partir de qual ponto de um UIView? É calculado a partir do canto superior esquerdo de um UIView.Na camada
anchorPoint
marca o ponto (na forma normalizada, ou seja, 0 a 1) de onde essa distância é calculada, por exemplo, layer.position = (20, 30) significa que a camadaanchorPoint
fica a 20 pontos da esquerda e a 30 pontos do topo da camada pai. Por padrão, um ponto de ancoragem da camada é (0,5; 0,5); portanto, o ponto de cálculo da distância fica bem no centro da camada. A figura a seguir ajudará a esclarecer meu ponto:anchorPoint
também é o ponto em torno do qual a rotação ocorrerá, caso você aplique uma transformação à camada.fonte
Existe uma solução tão simples. Isso é baseado na resposta de Kenny. Mas, em vez de aplicar o quadro antigo, use sua origem e o novo para calcular a tradução, depois aplique essa tradução ao centro. Também funciona com vista girada! Aqui está o código, muito mais simples que outras soluções:
fonte
Para quem precisa, aqui está a solução da Magnus no Swift:
fonte
view.setTranslatesAutoresizingMaskIntoConstraints(true)
. obrigado caraview.setTranslatesAutoresizingMaskIntoConstraints(true)
é necessário ao usar restrições de layout automático.translatesAutoresizingMaskIntoConstraints
é exatamente o que estava faltando, poderia ter aprendidoAqui está a resposta do usuário945711 ajustada para o NSView no OS X. Além do NSView não ter uma
.center
propriedade, o quadro do NSView não muda (provavelmente porque o NSViews não vem com um CALayer por padrão), mas a origem do quadro do CALayer é alterada quando o anchorPoint é alterado.fonte
Se você alterar o anchorPoint, sua posição também mudará, a menos que sua origem seja ponto zero
CGPointZero
.fonte
Edite e veja o ponto de ancoragem do UIView diretamente no Storyboard (Swift 3)
Essa é uma solução alternativa que permite alterar o ponto de ancoragem por meio do Inspetor de atributos e tem outra propriedade para exibir o ponto de ancoragem para confirmação.
Crie um novo arquivo para incluir no seu projeto
Adicione View ao Storyboard e defina a classe personalizada
Agora defina o novo ponto de ancoragem para o UIView
A ativação do Mostrar ponto de ancoragem exibirá um ponto vermelho para que você possa ver melhor onde o ponto de ancoragem será visualmente. Você sempre pode desligá-lo mais tarde.
Isso realmente me ajudou no planejamento de transformações em UIViews.
fonte
Para o Swift 3:
fonte
Expandindo a excelente e completa resposta de Magnus, criei uma versão que funciona em subcamadas:
fonte