Je développe une application pour iOS et j'utilise le Storyboard avec AutoLayout ON. L'un de mes contrôleurs de point de vue dispose d'un ensemble de 4 boutons et, dans certaines circonstances, j'aimerais faire disparaître le premier.
Si j'utilise la méthode setHidden:TRUE
, l'UIButton devient invisible mais prend toujours de la place dans la vue. Il en résulte un "trou" que je n'ai pas pu remplir, ce qui fait que l'UIButton restant flotte en direction du haut de la vue principale. .
Sous Android, j'aurais simplement utilisé View.GONE
au lieu de View.INVISIBLE
, mais sous iOS, je suis bloqué par ce comportement et je ne veux pas croire que la seule solution consiste à déplacer manuellement (oui par programme) les éléments restants vers le haut. .
Je pensais que j'aurais pu le faire en définissant une sorte de contrainte pour que tout soit aussi automatique que dans Android, mais je n'ai pas eu de chance.
Avant de désactiver l'autolayout, quelqu'un peut-il m'indiquer la bonne direction?
J'utilise l'IB, mais je suis également à l'aise avec les programmes.
METTRE À JOUR:
Le réglage de la hauteur du composant à 0 n’aide pas non plus.
J'ai essayé quelque chose comme ça:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
L'ajout d'une contrainte (NSLayoutAttributeHeight) qui définit la hauteur de la vue sur 0 a fonctionné pour moi:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
ajoutez une contrainte de hauteur à votre vue comme suit:
puis créez un point de vente pour la contrainte de hauteur dans votre fichier viewController comme suit:
& puis dans votre méthode viewDidLoad, modifiez la hauteur de contrainte en 0 comme suit:
override func viewDidLoad() {
super.viewDidLoad()
nsLcButtonHeight.constant = 0
}
Toutes les réponses à ces questions sont inefficaces . Le meilleur moyen de se passer d'Android setVisibility: La méthode passée sur iOS consiste à StackView
sélectionner d'abord les composants, puis dans l'éditeur, intégrer, Stack View,
connectez la nouvelle vue de pile avec IBOutlet, puis:
caché:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
firstView.hidden = YES;
visibilité:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
firstView.hidden = NO;
en utilisant la vue pile, toutes les contraintes seront conservées!
Ce que vous pouvez faire est de regrouper vos vues sous une vue de pile. Ensuite, lorsque vous masquez une vue particulière, les vues restantes sont automatiquement déplacées pour remplir l'espace.
Vous pouvez consulter la documentation Apple sur les vues de pile: https://developer.Apple.com/reference/uikit/uistackview
ou des tutoriels en ligne tels que: https://www.appcoda.com/stack-views-intro/
Pour obtenir la fonctionnalité Androids.GONE sur iOS, vous devez utiliser un UIStackView. Après cela cacher l'enfant par la position. ( Documentation sur les pommes )
Swift 4:
let firstView = cell.rootStackView.arrangedSubviews[0]
firstView.isHidden = true // first view gone
C'est un exemple de cellule de tableau, il suffit de mettre les deux insides Stack view
et d'obtenir item pour GONE
l'enfant.
https://github.com/tazihosniomar/LayoutManager
j'espère que cela vous aidera.
1) Si vos boutons sont placés verticalement, vous devez définir la height
sur 0 et, dans le cas de boutons placés horizontalement, essayez de définir width
sur 0 ou vous pouvez définir les deux sur 0.
OR
2) vous pouvez essayer cette approche qui place button2
au-dessus de button1
:
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setTitle:@"hello" forState:UIControlStateNormal];
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"world" forState:UIControlStateNormal];
[button1 sizeToFit]; [button2 sizeToFit];
[button2 setFrame:CGRectMake(button1.frame.Origin.x, button1.frame.Origin.y, button2.frame.size.width, button2.frame.size.height)];
[self.view addSubview:button1];
[self.view addSubview:button2];
}
Comme mes recherches l'ont montré, même AutoLayout ne peut vous aider. Vous devez remplacer manuellement les vues affectées par le composant facultatif affiché (dans mon cas, toutes les vues situées au bas de la vue facultative, mais vous pouvez sans doute l'adapter pour gérer tous les boutons situés à droite de votre bouton facultatif. ):
- (IBAction)toggleOptionalView:(id)sender {
if (!_expanded) {
self.optionalView.frame = CGRectMake(self.optionalView.frame.Origin.x, self.optionalView.frame.Origin.y, self.optionalView.frame.size.width, _optionalHeight);
self.bottomView.frame = CGRectMake(self.bottomView.frame.Origin.x, self.bottomView.frame.Origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
_expanded = YES;
} else {
self.optionalView.frame = CGRectMake(self.optionalView.frame.Origin.x, self.optionalView.frame.Origin.y, self.optionalView.frame.size.width, 0);
self.bottomView.frame = CGRectMake(self.bottomView.frame.Origin.x, self.bottomView.frame.Origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
_expanded = NO;
}
}
Il est conseillé de ne pas coder en dur la hauteur/largeur des composants optionnels, sinon votre code se briserait chaque fois que vous éditez le XIB/Storyboard. J'ai un champ float _optionalHeight que j'ai défini dans viewDidLoad, il est donc toujours à jour.
Cette question est assez ancienne, mais la chose la plus secrète que j'ai constatée est la définition de contraintes supplémentaires (les vues autour de la vue "disparue" savent alors quoi faire une fois manquantes)
A which you want to be A
| after setting B to gone |
B C
|
C
bConstraints
. Faites ceci en: bConstraints
.@IBOutlet var bConstraints: [NSLayoutConstraint]!
dans votre ViewController.Puis cachez B
B.hidden = true
NSLayoutConstraint.deactivateConstraints(bConstraints)
Dévoiler
B.hidden = false
NSLayoutConstraint.activateConstraints(bConstraints)
Évidemment, plus vous avez de vues, plus cela devient complexe, car vous avez besoin de contraintes supplémentaires pour chaque vue.
Vous pouvez également effacer la page, ou au moins certaines cellules de la page, et redéfinir le tout. C'est rapide et fonctionne bien. Je n'ai pas écrit le code, mais je l'ai trouvé dans ce projet préexistant sur lequel je travaille. Créez les classes ManagementTableSection
et ManagementTableCell
pour tout gérer. Désolé, je ne peux pas fournir de code mieux défini.
J'ai ajouté une nouvelle propriété à une implémentation UIView personnalisée appelée "visible" qui, lorsqu'elle est définie sur false, ajoute une contrainte pour réduire la vue (j'ai uniquement ajouté une contrainte de largeur car ma liste est horizontale, mais le meilleur moyen peut-être d'ajouter contrainte de hauteur de 0 également).
var visible:Bool = true{
didSet{
if(visible){
clipsToBounds = false;
removeConstraint(hideConstraint!)
}else{
clipsToBounds = true
addConstraint(hideConstraint!)
}
}
}
Vous devez initialiser la contrainte de largeur zéro sur la vue et l'ajouter en tant que champ:
private var hideConstraint:NSLayoutConstraint?
func someInitFunction(){
hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
...
}
Sur la base de la réponse fournie par Deniz, voici une solution utilisant des contraintes de Swift
Par exemple: si vous avez 3 vues, A_view B_view et C_view alignées verticalement dans cet ordre et que vous souhaitez masquer B et ajuster la différence, ajoutez une contrainte
B_view.removeFromSuperView()
var constr = NSLayoutConstraint(item: C_view,
attribute: NSLayoutAttribute.Top,
relatedBy: NSLayoutRelation.Equal,
toItem: A_view,
attribute: NSLayoutAttribute.Bottom,
multiplier: 1,
constant: 20)
view.addConstraint(constr)
constante est (dans ce cas) la quantité d'espace vertical entre C_view et A_view