Estou tentando entender as funcionalidades desses métodos. Você poderia me fornecer um simples caso de uso para entender a semântica deles?
Na documentação, por exemplo, o método convertPoint: fromView: é descrito da seguinte maneira:
Converte um ponto do sistema de coordenadas de uma determinada vista para o do receptor.
O que significa o sistema de coordenadas ? E o receptor ?
Por exemplo, faz sentido usar o convertPoint: fromView: como o seguinte?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
Usando o utilitário NSLog, verifiquei que o valor p coincide com o centro da view1.
Agradeço antecipadamente.
EDIT: para os interessados, criei um snippet de código simples para entender esses métodos.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
Nos dois casos, self.window é o receptor. Mas há uma diferença. No primeiro caso, o parâmetro convertPoint é expresso nas coordenadas da view1. A saída é a seguinte:
convertPoint: fromView: {100, 100}
No segundo, em vez disso, o convertPoint é expresso em coordenadas de superview (janela de auto). A saída é a seguinte:
convertPoint: toView: {0, 0}
convertPoint
econvertRect
diferem no tipo de retorno.CGPoint
ouCGRect
. Masfrom
e quantoto
? Existe uma regra prática que eu possa usar? Obrigado.Eu sempre acho isso confuso, então criei um playground onde você pode explorar visualmente o que a
convert
função faz. Isso é feito no Swift 3 e no Xcode 8.1b:Lembre-se de mostrar o Editor Assistente ( ⎇⌘⏎) para ver as visualizações, deve ficar assim:
Sinta-se livre para contribuir com mais exemplos aqui ou nesta essência .
fonte
self.view
são redundantes e de uso simples,view
seself
não forem necessários.self
Aqui está uma explicação em inglês simples.
Quando você deseja converter o retângulo de uma subvisão (
aView
é uma subvisão de[aView superview]
) para o espaço de coordenadas de outra visualização (self
).fonte
Todas as visualizações no iOS têm um sistema de coordenadas. Um sistema de coordenadas é como um gráfico, que tem o eixo x (linha horizontal) e o eixo y (linha vertical). O ponto em que as linhas se interceptam é chamado de origem. Um ponto é representado por (x, y). Por exemplo, (2, 1) significa que o ponto está com 2 pixels restantes e 1 pixel abaixo.
Você pode ler mais sobre sistemas de coordenadas aqui - http://en.wikipedia.org/wiki/Coordinate_system
Mas o que você precisa saber é que, no iOS, toda visualização possui seu próprio sistema de coordenadas, onde o canto superior esquerdo é a origem. O eixo X continua aumentando para a direita e o eixo y continua aumentando.
Para a questão de pontos de conversão, pegue este exemplo.
Há uma exibição, chamada V1, com 100 pixels de largura e 100 pixels de altura. Agora, dentro disso, há outra visualização, chamada V2, em (10, 10, 50, 50), o que significa que (10, 10) é o ponto no sistema de coordenadas da V1 onde o canto superior esquerdo da V2 deve estar localizado e ( 50, 50) é a largura e a altura de V2. Agora, observe um ponto no sistema de coordenadas do V2, digamos (20, 20). Agora, qual seria esse ponto dentro do sistema de coordenadas da V1? É para isso que servem os métodos (é claro que você pode se calcular, mas economiza um trabalho extra). Para o registro, o ponto em V1 seria (30, 30).
Espero que isto ajude.
fonte
Obrigado a todos por postar a pergunta e suas respostas: Isso me ajudou a resolver isso.
Meu controlador de exibição tem sua exibição normal.
Dentro dessa visualização, há várias visualizações de agrupamento que fazem pouco mais do que fornecer às visualizações filho uma interação limpa com restrições de layout automáticas.
Dentro de uma dessas visualizações de agrupamento, tenho um botão Adicionar que apresenta um controlador de exibição de popover em que o usuário digita algumas informações.
Durante a rotação do dispositivo, o controlador de exibição é alertado por meio do popoverController de chamada UIPopoverViewControllerDelegate: willRepositionPopoverToRect: inView:
A parte essencial que vem da explicação dada pelas duas primeiras respostas acima foi que o correto que eu precisava converter era o limite do botão adicionar, não o quadro.
Não tentei isso com uma hierarquia de visualização mais complexa, mas suspeito que, usando a visualização fornecida na chamada de método (inView :), contornamos as complicações dos tipos de feiúra da visualização em folha em várias camadas.
fonte
Eu usei este post para aplicar no meu caso. Espero que isso ajude outro leitor no futuro.
Uma visão pode ver apenas seus filhos imediatos e pais. Não consegue ver a visão de seus avós ou netos.
Então, no meu caso, eu tenho uma vista pai grande chamado
self.view
, nesteself.view
eu adicionei subviews chamadosself.child1OfView
,self.child2OfView
. Emself.child1OfView
, eu adicionei subviews chamadosself.child1OfView1
,self.child2OfView1
.Agora, se eu me mover fisicamente
self.child1OfView1
para uma área fora do limite de outroself.child1OfView
localself.view
, calcule a nova posição para oself.child1OfView1
interior doself.view:
fonte
Você pode ver o código abaixo para entender como ele realmente funciona.
fonte
Li a resposta e entendi a mecânica, mas acho que o exemplo final não está correto. De acordo com o documento da API, a propriedade central de uma vista contém o ponto central conhecido da vista no sistema de coordenadas da superview.
Se for esse o caso, acho que não faria sentido tentar solicitar à superview a conversão do centro de uma subview do sistema de coordenadas da subview, porque o valor não está no sistema de coordenadas da subview. O que faria sentido é fazer o oposto, ou seja, converter do sistema de coordenadas da superview para o de uma subview ...
Você pode fazer isso de duas maneiras (ambas devem gerar o mesmo valor):
ou
Estou muito longe de entender como isso deve funcionar?
fonte
Mais um ponto importante sobre o uso dessas APIs. Certifique-se de que a cadeia de visualizações pai esteja completa entre o retângulo que você está convertendo e a visualização de / para. Por exemplo - aView, bView e cView -
Se tentarmos executar o método antes que o bView seja adicionado como uma sub-visualização do cView, receberemos uma resposta de bunk. Infelizmente, não há proteção incorporada aos métodos para este caso. Isso pode parecer óbvio, mas é algo a ter em atenção nos casos em que a conversão passa por uma longa cadeia de pais.
fonte