Eu tenho um UIView
dentro de um UIView
me quero que o interior UIView
esteja sempre centrado dentro do exterior, sem que seja necessário redimensionar a largura e a altura.
Eu configurei os suportes e molas para que fiquem em cima / esquerda / direita / baixo sem definir o redimensionamento. Mas ainda não está centralizado. Qualquer ideia?
iphone
objective-c
ios
ipad
xonegirlz
fonte
fonte
Respostas:
Objetivo-C
Rápido
fonte
bounds
e não oframe
, pois oframe
é indefinido se a visualização tiver umtransform
.size
está sendo usado.frame
propriedade inteira é indefinida se a visualização tiver umatransform
transformação que não seja a identidade; leia a documentação na propriedade de quadro do UIView .Você pode fazer isso e sempre funcionará:
E para Swift:
fonte
child.center = parent.center
. Eu usaria `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Isso sempre terá sua subvisão centralizada, independentemente do seu centro de visualização principal.UIView.bounds
é relativo à própria visão (e, portanto,bounds.origin
é inicialmente zero), enquantoUIView.center
é especificado no sistema de coordenadas da super visão .Antes de começarmos, lembremos que o ponto de origem é o canto superior esquerdo
CGPoint
de uma visualização. Uma coisa importante a entender sobre pontos de vista e pais.Vamos dar uma olhada neste código simples, um controlador de exibição que adiciona um quadrado preto:
Isso criará esta visualização: a origem e o centro do retângulo preto se encaixam nas mesmas coordenadas do pai.
Agora vamos tentar adicionar subView outro SubSubView e dar ao subSubview a mesma origem do subView, mas tornar o subSubView uma visão filho do subView
Adicionaremos este código:
E este é o resultado:
Devido a esta linha:
Você espera que a origem do retângulo roxo seja a mesma de seu pai (o retângulo preto), mas fica abaixo dele, e por que isso? Como quando você adiciona uma visualização a outra, o quadro "mundo" do subView agora é o pai BOUND RECTANGLE, se você tem uma visão de que sua origem na tela principal está nas cordas (15,15) para todas as sub-vistas, o o canto superior esquerdo será (0,0)
É por isso que você sempre precisa se referir a um pai pelo retângulo vinculado, que é o "mundo" de seus subViews, vamos corrigir esta linha para:
E veja a mágica, o subSubview agora está localizado exatamente em sua origem pai:
Então, você gosta de "ok, eu só queria centralizar minha visão pela visão de meus pais, qual é o problema?" bem, não é grande coisa, você só precisa "traduzir" o ponto central pai, que é retirado de seu quadro para o centro de limites dos pais, fazendo o seguinte:
Na verdade, você está dizendo a ele "pegue o centro de visualização dos pais e converta-o no mundo subSubView".
E você obterá este resultado:
fonte
Eu usaria:
Eu gosto de usar as
CGRect
opções ...SWIFT 3:
fonte
1. Se você tiver o pagamento automático ativado:
Antes de tudo, desabilite o dimensionamento automático das visualizações filho
Se você é UIView + Autolayout ou Purelayout :
Se você estiver usando apenas métodos de pagamento automático no nível do UIKit:
2. Sem autolayout:
Eu prefiro:
fonte
CGRectIntegral
A maneira mais fácil:
fonte
Defina esta máscara de redimensionamento automático para sua visão interna.
fonte
Com o IOS9, você pode usar a API de âncora do layout.
O código ficaria assim:
A vantagem deste sobre
CGPointMake
ouCGRect
é que, com esses métodos você está definindo o centro da vista a uma constante, mas com esta técnica você está definindo uma relação entre os dois pontos de vista que irá realizar para sempre, não importa como aparentview
mudanças.Apenas certifique-se antes de fazer isso:
e para definir
translatesAutoresizingMaskIntoConstraints
de cada visualização como false.Isso evitará falhas e o AutoLayout interferirá.
fonte
Você pode usar
E no Swift 3.0
fonte
Usar o mesmo centro na visualização e na subvisualização é a maneira mais simples de fazê-lo. Você pode fazer algo assim,
fonte
Outra solução com PureLayout usando
autoCenterInSuperview
.É assim que se parece:
fonte
Em c # ou Xamarin.ios, podemos usar assim
imageView.Center = novo CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
fonte
Eu usaria:
Isso é simples, curto e doce. Se você usar a resposta de @ Hejazi acima e
parent.center
estiver definido como algo diferente de(0,0)
sua subvisão, não será centralizado!fonte
fonte