web-dev-qa-db-fra.com

équivalent iOS pour le mode de visibilité Android View.GONE

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;
70
elbuild

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]];
36
Deniz

ajoutez une contrainte de hauteur à votre vue comme suit:  enter image description here

puis créez un point de vente pour la contrainte de hauteur dans votre fichier viewController comme suit:  enter image description here

& puis dans votre méthode viewDidLoad, modifiez la hauteur de contrainte en 0 comme suit:

override func viewDidLoad() {
    super.viewDidLoad()
nsLcButtonHeight.constant = 0
}
15
Ajinkya Patil

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!

Document

15
Beyaz

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/

6
mechdon

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.

 enter image description here

4
Md Imran Choudhury

https://github.com/tazihosniomar/LayoutManager

j'espère que cela vous aidera.

1
poyo fever.

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];

}
1
iphondroid

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.

0
Katlu

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                               
  1. Définissez une contrainte de priorité inférieure (750) de C à A. 
  2. Ajoutez les contraintes supérieure et inférieure de B (ou gauche et droite si vous souhaitez que votre vue soit réduite horizontalement) à un tableau NSLayoutConstraint bConstraints. Faites ceci en:
    1. Cliquez sur la commande et faites-la glisser de la contrainte vers ViewController.
    2. Changer la connexion de sortie en collection de prises
    3. Pour le nom mis bConstraints.
    4. Hit Connect. Cela créera un @IBOutlet var bConstraints: [NSLayoutConstraint]! dans votre ViewController.
    5. Pour ajouter des contraintes supplémentaires: faites glisser la contrainte de Storyboard vers le nom de la variable @IBOutlet. 
  3. Puis cachez B

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. 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.

0
wyu

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.

0
craned

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)
    ...
}
0
Anthony De Smet

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

0
The4thIceman