Tengo un UIViewam interior UIViewy quiero que el interior UIViewesté 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
boundsy no elframe, ya que elframeno está definido si la vista tiene untransform.sizese está utilizando.framepropiedad está indefinida si la vista tiene unatransformtransformació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.boundses relativo a la vista en sí (y, porbounds.originlo tanto, es inicialmente cero), mientras queUIView.centerse especifica en el sistema de coordenadas de la supervista .Antes de comenzar, recordemos que el punto de origen es la esquina superior izquierda
CGPointde 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
CGRectopciones ...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
CGRectIntegralLa 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, oCGRectes 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 losparentviewcambios.Solo asegúrate antes de hacer esto:
y para configurar el
translatesAutoresizingMaskIntoConstraintspara 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.centerestá configurada para otra cosa que no sea(0,0)su subvista, no estará centrada!fuente
fuente