Tengo un UIView
am interior UIView
y quiero que el interior UIView
esté siempre centrado dentro del exterior, sin que tenga que cambiar el ancho y la altura.
He configurado los puntales y los resortes para que esté en la parte superior / izquierda / derecha / inferior sin configurar el cambio de tamaño. Pero todavía no se centra. ¿Alguna idea?
iphone
objective-c
ios
ipad
xonegirlz
fuente
fuente
Respuestas:
C objetivo
Rápido
fuente
bounds
y no elframe
, ya que elframe
no está definido si la vista tiene untransform
.size
se está utilizando.frame
propiedad está indefinida si la vista tiene unatransform
transformación que no es la identidad; lea la documentación sobre la propiedad del marco de UIView .Puedes hacer esto y siempre funcionará:
Y para Swift:
fuente
child.center = parent.center
. Usaría `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Esto siempre tendrá su subvista centrada independientemente de lo que esté configurado su centro de vista principal.UIView.bounds
es relativo a la vista en sí (y, porbounds.origin
lo tanto, es inicialmente cero), mientras queUIView.center
se especifica en el sistema de coordenadas de la supervista .Antes de comenzar, recordemos que el punto de origen es la esquina superior izquierda
CGPoint
de una vista. Una cosa importante para entender sobre las opiniones y los padres.Echemos un vistazo a este código simple, un controlador de vista que agrega a su vista un cuadrado negro:
Esto creará esta vista: el origen y centro del rectángulo negro se ajusta a las mismas coordenadas que su padre
Ahora intentemos agregar subView a otro SubSubView y darle a subSubview el mismo origen que subView, pero haga que subSubView sea una vista secundaria de subView
Agregaremos este código:
Y este es el resultado:
Debido a esta línea:
Esperas que el origen del rectángulo púrpura sea el mismo que el padre (el rectángulo negro) pero se encuentra debajo de él, y ¿por qué es eso? Debido a que cuando agrega una vista a otra vista, el "mundo" del marco subView ahora es su RECTÁNGULO CONDUCIDO padre, si tiene una vista de que su origen en la pantalla principal está en las coordenadas (15,15) para todas sus vistas secundarias, el la esquina superior izquierda será (0,0)
Es por eso que siempre debe referirse a un padre por su rectángulo encuadernado, que es el "mundo" de sus subVistas, arreglemos esta línea para:
Y vea la magia, la subvista secundaria ahora se encuentra exactamente en su origen principal:
Entonces, te gusta "ok, solo quería centrar mi punto de vista por el de mis padres, ¿cuál es el problema?" bueno, no es gran cosa, solo necesitas "traducir" el punto central principal que se toma de su marco al centro de límites de los padres haciendo esto:
En realidad le estás diciendo "toma el centro de visualización de los padres y conviértelo en el mundo subSubView".
Y obtendrás este resultado:
fuente
Yo usaría:
Me gusta usar las
CGRect
opciones ...SWIFT 3:
fuente
1. Si tiene habilitada la distribución automática:
En primer lugar, deshabilitar las vistas secundarias de autoresizing
Si eres UIView + Autolayout o Purelayout :
Si está utilizando solo métodos de distribución automática de nivel UIKit:
2. Sin autolayout:
Yo prefiero:
fuente
CGRectIntegral
La forma más fácil:
fuente
Establezca esta máscara de autoresizing a su vista interna.
fuente
Con IOS9 puede usar la API de anclaje de diseño.
El código se vería así:
La ventaja de este sobre
CGPointMake
, oCGRect
es que con esos métodos se está ajustando el centro de la vista a una constante, pero con esta técnica está estableciendo una relación entre los dos puntos de vista que ha de tener, no importa cómo losparentview
cambios.Solo asegúrate antes de hacer esto:
y para configurar el
translatesAutoresizingMaskIntoConstraints
para cada vista en falso.Esto evitará que se bloquee y que AutoLayout interfiera.
fuente
Puedes usar
Y en Swift 3.0
fuente
Usar el mismo centro en la vista y subvista es la forma más sencilla de hacerlo. Puedes hacer algo como esto
fuente
Otra solución con PureLayout usando
autoCenterInSuperview
.Así es como se ve:
fuente
En c # o Xamarin.ios, podemos usar así
imageView.Center = nuevo CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
fuente
Yo usaría:
Esto es simple, corto y dulce. ¡Si usa la respuesta de @Hejazi anterior y
parent.center
está configurada para otra cosa que no sea(0,0)
su subvista, no estará centrada!fuente
fuente