Comment faire pour centrer une sous-vue de UIView
J'ai un UIView
à l'intérieur d'un UIView
m et je veux l'intérieur UIView
être toujours centré à l'intérieur de l'extérieur, sans avoir à redimensionner la largeur et la hauteur.
J'ai mis les jambes de suspension et les ressorts de sorte que c'est sur haut/gauche/droite/bas, sans réglage de la redimensionner. Mais elle n'est pas toujours le centre. Une idée?
- Veuillez examiner votre accepté de répondre que la solution proposée par @Hejazi est nettement plus élégant.
- L'on a accepté la réponse est mauvaise et crash. Hejazi de répondre à de grandes œuvres.
Vous devez vous connecter pour publier un commentaire.
Objective-C
Swift
bounds
et pas leframe
, comme leframe
est pas défini si la vue a untransform
.size
est utilisé.frame
propriété n'est pas définie si la vue a untransform
qui n'est pas l'identité de transformation; lire le documentation sur la propriété cadre de UIView.Vous pouvez le faire et il le sera toujours:
Et Swift:
child.center = parent.center
. Je voudrais utiliser `enfant.centre = CGPointMake(parent.les limites.hauteur/2, parent.les limites.largeur/2)'. Cela permettra de toujours avoir votre sous-vue centré indépendamment de ce que votre parent centre de la vue est réglé.UIView.bounds
est par rapport à la vue (et doncbounds.origin
est initialement égale à zéro), alors queUIView.center
est spécifié dans le système de coordonnées de la superview.Avant, nous allons commencer, nous allons simplement rappeler que le point d'origine est le coin Supérieur Gauche
CGPoint
de vue.Une chose importante à comprendre au sujet des points de vue et les parents.
Permet de jeter un oeil à ce simple code, une-vue-contrôleur qui ajoute à la vue d'un carré noir:
Cela va créer ce point de vue:
le rectangle noir origine et au centre à fait avec les mêmes coordonnées que c'est parent
Maintenant, nous allons essayer d'ajouter un autre sous-vue SubSubView, et de donner subSubview même origine que le sous-vue, mais de faire de la subSubView un enfant en vue de la sous-vue
Nous allons ajouter ce code:
Et voilà le résultat:
À cause de cette ligne:
Que vous attendez pour le rectangle violet l'origine pour être la même que celle du parent (le rectangle noir), mais il passe sous elle, et pourquoi?
Parce que lorsque vous ajoutez un affichage à un autre point de vue, la sous-vue frame "monde" est maintenant celle du parent LIÉ RECTANGLE, si vous avez un point de vue que c'est d'origine sur l'écran principal est à coords (15,15) pour tous les sous-points de vue, le coin supérieur gauche de (0,0)
C'est pourquoi vous devez toujours vous référer à un parent par il est lié rectangle, qui est le "monde" de la il est sous-vues, permet de fixer cette ligne:
Et voir la magie, la subSubview est maintenant situé exactement à celle du parent d'origine:
Alors, vous aimez "ok je ne voulais centre de mon point de vue par mes parents, quel est le big deal?"
eh bien, ce n'est pas une grosse affaire, vous avez juste besoin de "traduire" le parent point central qui est prise d'image du parent du centre de limites
en faisant ceci:
Que vous êtes en train de lui dire "prendre les parents centre de la vue, et de le convertir en subSubView monde".
Et vous obtiendrez ce résultat:
Je voudrais utiliser:
J'aime utiliser les
CGRect
options...SWIFT 3:
1. Si vous avez de la mise en page automatique activée:
Tout d'abord désactiver les vues enfant d'un redimensionnement automatique
Si vous êtes UIView+mise en page automatique ou Purelayout:
Si vous utilisez uniquement UIKit niveau de la mise en page automatique méthodes:
2. Sans mise en page automatique:
Que je préfère:
CGRectIntegral
La façon la plus simple:
Définir ce d'un redimensionnement automatique de masque à votre point de vue interne.
Avec IOS9 vous pouvez utiliser la mise en page d'ancrage de l'API.
Le code devrait ressembler à ceci:
L'avantage de ce
CGPointMake
ouCGRect
est que, avec ces méthodes, vous définissez le centre de la vue à une constante mais avec cette technique, vous définissez une relation entre les deux points de vue qui sera pour toujours, peu importe la façon dont lesparentview
changements.Juste être sûr avant de faire cela à faire:
et de définir le
translatesAutoresizingMaskIntoConstraints
pour chaque vue de faux.Cela permettra d'éviter de s'écraser et de mise en page automatique d'interférer.
Vous pouvez utiliser
Et Swift 3.0
En utilisant le même centre de la vue et de la sous-vue est la façon la plus simple de le faire. Vous pouvez faire quelque chose comme cela,
Une autre solution avec PureLayout à l'aide de
autoCenterInSuperview
.C'est ce à quoi ça ressemble:
Je voudrais utiliser:
C'est simple, court et doux. Si vous utilisez @Hejazi la réponse ci-dessus et
parent.center
est réglé sur autre chose que(0,0)
votre sous-vue ne sera pas centré!En c# ou Xamarin.ios, on peut utiliser comme cette
imageView.Centre = new CGPoint(tempView.Cadre.Taille.Largeur /2,
tempView.Cadre.Taille.Hauteur /2);