J'ai UIView
un UIView
m intérieur et je veux que l'intérieur UIView
soit toujours centré à l'intérieur de l'extérieur, sans qu'il soit nécessaire de redimensionner la largeur et la hauteur.
J'ai défini les entretoises et les ressorts de manière à ce qu'ils soient en haut / gauche / droite / bas sans définir le redimensionnement. Mais cela ne se concentre toujours pas. Une idée?
iphone
objective-c
ios
ipad
xonegirlz
la source
la source
Réponses:
Objectif c
Rapide
la source
bounds
et non leframe
, car leframe
n'est pas défini si la vue a untransform
.size
est utilisé.frame
propriété entière n'est pas définie si la vue a unetransform
qui n'est pas la transformation d'identité; lisez la documentation sur la propriété frame de UIView .Vous pouvez le faire et cela fonctionnera toujours:
Et pour Swift:
la source
child.center = parent.center
. J'utiliserais `child.center = CGPointMake (parent.bounds.height / 2, parent.bounds.width / 2) '. Votre sous-vue sera toujours centrée, quel que soit le réglage de votre centre de vue parent.UIView.bounds
est relatif à la vue elle-même (etbounds.origin
est donc initialement zéro), tandis queUIView.center
est spécifié dans le système de coordonnées de la vue de supervision .Avant de commencer, rappelons simplement que le point d'origine est le coin supérieur gauche
CGPoint
d'une vue. Une chose importante à comprendre sur les opinions et les parents.Jetons un œil à ce code simple, un contrôleur de vue qui ajoute à sa vue un carré noir:
Cela créera cette vue: l'origine et le centre du rectangle noir correspondent aux mêmes coordonnées que son parent
Essayons maintenant d'ajouter une sous-vue à une autre sous-vue, et en donnant à la sous-vue la même origine que la sous-vue, mais en faisant de la sous-vue une vue enfant de la sous-vue
Nous ajouterons ce code:
Et voici le résultat:
En raison de cette ligne:
Vous vous attendez à ce que l'origine du rectangle violet soit la même que son parent (le rectangle noir), mais il passe en dessous, et pourquoi? Parce que lorsque vous ajoutez une vue à une autre vue, le cadre de sous-vue "monde" est maintenant son parent BOUND RECTANGLE, si vous avez une vue dont l'origine sur l'écran principal est aux coordonnées (15,15) pour toutes ses sous-vues, le le coin supérieur gauche sera (0,0)
C'est pourquoi vous devez toujours faire référence à un parent par son rectangle lié, qui est le "monde" de ses sous-vues, fixons cette ligne à:
Et voyez la magie, la sous-vue est maintenant située exactement dans son origine parent:
Alors, vous aimez "ok, je voulais seulement centrer mon point de vue sur le point de vue de mes parents, quel est le problème?" eh bien, ce n'est pas grave, vous avez juste besoin de "traduire" le point central parent qui est pris de son cadre au centre des limites du parent en faisant ceci:
Vous lui dites en fait "prenez le centre de vue des parents et convertissez-le en monde subSubView".
Et vous obtiendrez ce résultat:
la source
J'utiliserais:
J'aime utiliser les
CGRect
options ...SWIFT 3:
la source
1. Si vous avez activé la mise en page automatique:
Tout d'abord désactiver la redimensionnement automatique des vues enfants
Si vous êtes UIView + Autolayout ou Purelayout :
Si vous n'utilisez que des méthodes de mise en page automatique de niveau UIKit:
2. Sans mise en page automatique:
Je préfère:
la source
CGRectIntegral
Le moyen le plus simple:
la source
Réglez ce masque de redimensionnement automatique sur votre vue intérieure.
la source
Avec IOS9, vous pouvez utiliser l'API d'ancrage de mise en page.
Le code ressemblerait à ceci:
L'avantage de ceci par rapport à
CGPointMake
ouCGRect
est qu'avec ces méthodes, vous définissez le centre de la vue sur une constante, mais avec cette technique, vous définissez une relation entre les deux vues qui durera pour toujours, quelle que soit la façon dont lesparentview
changements.Assurez-vous simplement avant de faire ceci:
et pour définir le
translatesAutoresizingMaskIntoConstraints
for each view sur false.Cela empêchera les plantages et la mise en page automatique d'interférer.
la source
Vous pouvez utiliser
Et dans Swift 3.0
la source
Utiliser le même centre dans la vue et la sous-vue est le moyen le plus simple de le faire. Tu peux faire quelque chose comme ça,
la source
Une autre solution avec PureLayout utilisant
autoCenterInSuperview
.Voici à quoi ça ressemble:
la source
En c # ou Xamarin.ios, nous pouvons utiliser comme ceci
imageView.Center = nouveau CGPoint (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
la source
J'utiliserais:
C'est simple, court et doux. Si vous utilisez la réponse de @ Hejazi ci-dessus et
parent.center
est réglé sur autre chose que(0,0)
votre sous-vue ne sera pas centrée!la source
la source