iOS Conteneur de Vue ne fait pas honneur intrinsicContentSize
Je veux utiliser un Conteneur en Vue de contenir un aperçu de la caméra. Je veux que la caméra centrée au milieu et à l'entretenir en bon aspect ratio. (il est rose à l'évidence où son image est)
Je suis bloqué à la première étape d'essayer d'obtenir l'aperçu de la caméra à comparaître à une taille plus petite que le conteneur.
J'ai une UIView sous-classe pour le Contrôleur de Caméra de vue, et le code:
- (CGSize)intrinsicContentSize
{
return CGSizeMake(320, 240);
}
Malheureusement, ce n'est pas honoré:
À partir de la lecture de la documentation, intrinsicContentSize
semble que c'est ce que je veux. Finalement, je veux utiliser la Mise en page Automatique en tant que bien, mais je suis en train de résoudre une chose à la fois.
Comment puis-je faire ce travail?
Vous devez vous connecter pour publier un commentaire.
Mise en page automatique utilise le
intrinsicContentSize
de la propriété. Si vous n'utilisez pas de mise en page automatique, le système ne va pas demander à tout point de vue pour sonintrinsicContentSize
.La rose sera forcé à la taille du conteneur de vue, sauf si vous écrivez du code. Cela est vrai si vous utilisez la mise en page automatique ou pas. C'est juste la façon conteneur des vues créées dans un storyboard de travail. Le système ne vous demandera pas votre rose vue de son
intrinsicContentSize
.Puisque vous impliquer que vous êtes pas l'utilisation de l'auto mise en page, voici une façon vous pouvez faire le conteneur de vue, la
intrinsicContentSize
de son contenu à afficher. Faire une sous-classe deUIView
appeléCameraContainerView
et de définir ce que la classe personnalisée du conteneur de vue. RemplaceraddSubview:
dans cette nouvelle classe:Qui est suffisant dans mes tests. (Il ne restera pas jusqu'à ce jour si la sous-vue de l'évolution de ses
intrinsicContentSize
dynamiquement.)Si vous décidez d'utiliser la mise en page automatique, vous devez définir des contraintes entre le conteneur de vue et l'affichage du contenu, et vous avez besoin de supprimer toutes les contraintes conflictuelles.
Tout d'abord, dans votre scénario, assurez-vous que le conteneur affichage explicite de la largeur et de la hauteur des contraintes. (Ces contraintes seront supprimées pour leur taille exacte n'a pas d'importance.) Donner
CameraContainerView
une prise de courant pour chacune de ces contraintes:Connecter ces prises aux contraintes dans le storyboard. Notez que ces points de vente sont sur
CameraContainerView
, pas surViewController
, alors n'essayez pas de glisser à partir de la vue du contrôleur des contraintes; qui ne fonctionne pas.Aussi assurez-vous que le conteneur point de vue n'est pas épinglé à la fois à gauche et à droite (avant et arrière) bords de son superview, et qu'il n'est pas épinglé à la fois le haut et le bas de son superview. Il est important que le conteneur de vue de la taille déterminée seulement par ses explicite de la largeur et de la hauteur des contraintes.
Après que vous avez mis en place les contraintes dans le storyboard et relié les points de vente, vous pouvez réécrire
addSubview:
pour la mise en page automatique. Vous aurez besoin de désactivertranslatesAutoresizingMaskIntoConstraints
sur la vue intégrée:Alors vous devez supprimer la largeur et la hauteur des contraintes qui ont été chargés à partir de la table de montage séquentiel:
Enfin, vous pouvez mettre en place de nouvelles contraintes que la position de la vue intégrée dans le conteneur de vue et de faire le conteneur de vue de l'adapter à la taille de la vue intégrée:
Qui a travaillé lors de mes tests, et devrait rester à jour si la sous-vue de l'évolution de ses
intrinsicContentSize
de façon dynamique, aussi longtemps que la sous-vue envoie lui-mêmeinvalidateIntrinsicContentSize
.viewA
) a des sous-vues avec les contraintes qui pourraient définirviewA
's largeur, queviewA
ne dispose pas encore d'une caractéristique intrinsèque de la taille du contenu, et qu'il n'a pas d'ajuster sa largeur et sa hauteur en fonction de la sous-vues' de largeur et de hauteur?intrinsicContentSize
à une valeur raisonnable. bradley.ayers déjà fait, mais ne pas le faire n'est pas une option. Je peux maintenant répondre à ma question précédente: non,intrinsincContentSize
ne pas avoir un sens de la valeur même si je laisse sa taille est déterminée par les sous-vues. Toutefois, tout simplement primordialintrinsicContentSize
àreturn self.bounds.size
ont permis de résoudre ce problème. Merci encore pour votre écriture-up, rob!J'ai trouvé un bug dans Interface Builder. Avec son aide , vous pouvez ajouter une vue personnalisée avec intrinsicContentSize.
1) Ajouter UIButton sur la Vue dans Interface Builder. J'ai mis centerY et centerX contraintes. Ce bouton est votre vue personnalisée.
2) le Remplacement de la superclasse votre vue personnalisée pour UIButton:
à
3) Définir la classe UIButton en storyboard :
4) le Retour de la superclasse votre vue personnalisée:
5) de l'Exécution. Mon CustomView montrer carré gris (300х300) sur le centre de l'écran. Compiler sans erreurs et des avertissements.
Résultat :