web-dev-qa-db-de.com

iOS-Äquivalent für Android View.GONE-Sichtbarkeitsmodus

Ich entwickle eine App für iOS und verwende das Storyboard mit AutoLayout ON. Einer meiner View-Controller verfügt über 4 Schaltflächen. Unter bestimmten Umständen möchte ich den ersten verschwinden lassen.

Wenn ich die setHidden:TRUE-Methode verwende, wird das UIButton-Objekt unsichtbar, es nimmt jedoch offensichtlich Platz in der Ansicht ein, und das Ergebnis ist ein "Loch", das ich nicht füllen konnte, sodass das verbleibende UIButton-Element zum oberen Rand der Hauptansicht verschoben wurde .

In Android hätte ich einfach View.GONE anstelle von View.INVISIBLE verwendet, aber bei iOS bleibe ich bei diesem Verhalten und ich möchte nicht glauben, dass die einzige Lösung darin besteht, die restlichen Elemente manuell (ja, programmgesteuert) nach oben zu verschieben .

Ich dachte, ich hätte es schaffen können, eine Art Einschränkung zu setzen, um alles so automatisch zu machen, wie es in Android ist, aber ich hatte kein Glück. 

Kann ich vor dem Ausschalten von Autolayout auf die richtige Richtung weisen?

Ich benutze die IB, aber ich bin auch mit programmatischem Material vertraut.

UPDATE:

Wenn Sie die Komponentenhöhe auf 0 setzen, ist dies auch nicht hilfreich.

Ich habe so etwas ausprobiert:

UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
70
elbuild

Hinzufügen einer Einschränkung (NSLayoutAttributeHeight), die die Höhe der Ansicht auf 0 setzt, arbeitete für mich:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
36
Deniz

fügen Sie Ihrer Ansicht eine Höhenbeschränkung hinzu:  enter image description here

nehmen Sie dann wie folgt einen Auslass für die Höhenbeschränkung in Ihrer viewController-Datei vor:  enter image description here

& dann ändern Sie in Ihrer viewDidLoad-Methode die Bedingungshöhe wie folgt in 0:

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

Alle Antworten auf diese Fragen sind ineffizient. Die beste Möglichkeit, Android setVisibility zu verwenden: Die Methode unter iOS ist die, dass StackView zuerst Komponenten auswählt, dann im Editor, in Stack View,

neue Stack-Ansicht mit IBOutlet verbinden, dann:

versteckt:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = YES;

sichtweite:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = NO;

bei Verwendung der Stack-Ansicht bleiben alle Einschränkungen erhalten!

Dokument

15
Beyaz

Sie können Ihre Ansichten in einer Stapelansicht gruppieren. Wenn Sie dann eine bestimmte Ansicht ausblenden, werden die verbleibenden Ansichten automatisch verschoben, um den Bereich zu füllen. 

Sie können die Apple-Dokumentation zu Stack-Ansichten überprüfen: https://developer.Apple.com/reference/uikit/uistackview

oder Online-Tutorials wie: https://www.appcoda.com/stack-views-intro/

6
mechdon

Um die Androids.GONE-Funktion unter iOS zu erreichen, müssen Sie eine UIStackView verwenden. Danach verstecken Sie das Kind nach Position. ( Äpfel-Dokumentation )

Swift 4:

let firstView = cell.rootStackView.arrangedSubviews[0]
    firstView.isHidden = true // first view gone

Dies ist ein Beispiel für eine Tabellenzelle. Setzen Sie einfach beide Insides Stack view und erhalten Sie ein Element für GONE das untergeordnete Element.

 enter image description here

4
1
poyo fever.

1) Wenn Ihre Tasten vertikal platziert sind, müssen Sie die Variable height auf 0 setzen, und bei horizontal platzierten Tasten versuchen Sie, width auf 0 zu setzen. 

OR

2) Sie könnten diesen Ansatz ausprobieren, der button2 auf button1 setzt: 

- (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

Wie meine Forschung gezeigt hat, kann Ihnen nicht einmal AutoLayout helfen. Sie müssen die Ansichten, die von der optional angezeigten Komponente betroffen sind, manuell ersetzen (in meinem Fall alle Ansichten unten in der optionalen Ansicht. Sie sind jedoch sicher, dass Sie diese Option anpassen können, um alle Schaltflächen rechts von der optionalen Schaltfläche zu bearbeiten ):

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

    }
}

Es wird empfohlen, die Höhe/Breite der optionalen Komponenten nicht fest zu codieren. Andernfalls wird Ihr Code bei jeder Bearbeitung des XIB/Storyboards beschädigt. Ich habe ein Feld float _optionalHeight, das ich in viewDidLoad gesetzt habe, es ist also immer auf dem neuesten Stand.

0
Katlu

Diese Frage ist ziemlich alt, aber die Schrank-Sache, die ich gefunden habe, besteht darin, zusätzliche Einschränkungen festzulegen.

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. Legen Sie eine Einschränkung mit niedriger Priorität (750) von C auf A fest. 
  2. Fügen Sie die oberen und unteren Randbedingungen von B (oder links und rechts, wenn Ihre Ansicht horizontal reduziert werden soll) einem NSLayoutConstraint-Array bConstraints hinzu. Tun Sie dies durch:
    1. Klicken Sie mit der Maus auf das ViewController-Steuerelement, und ziehen Sie es
    2. Ändern Sie die Verbindung von Outlet zu Outlet Collection
    3. Für den Namen bConstraints.
    4. Klicken Sie auf Verbinden. Dadurch wird ein @IBOutlet var bConstraints: [NSLayoutConstraint]! in Ihrem ViewController erstellt
    5. So fügen Sie zusätzliche Einschränkungen hinzu: Ziehen Sie aus der Einschränkung in Storyboard auf den Namen der @IBOutlet-Variablen 
  3. Dann verstecken Sie B

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. Zu enthüllen

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

Je mehr und mehr Ansichten Sie haben, desto komplexer wird dies, da Sie zusätzliche Einschränkungen für jede Ansicht benötigen

0
wyu

Sie können auch die Seite oder zumindest bestimmte Zellen der Seite löschen und das Ganze neu definieren. Es ist schnell und funktioniert gut. Ich habe den Code nicht geschrieben, sondern in diesem bereits bestehenden Projekt, an dem ich gerade arbeite, gefunden. Erstellen Sie ManagementTableSection- und ManagementTableCell-Klassen, um alles zu verwalten. Entschuldigung, ich kann keinen besser definierten Code angeben.

0
craned

Ich habe einer benutzerdefinierten UIView - Implementierung mit dem Namen "visible" eine neue Eigenschaft hinzugefügt. Wenn diese Eigenschaft auf "false" gesetzt ist, wird eine Einschränkung hinzugefügt, um die Ansicht zu reduzieren. Ich habe nur eine Breitenbeschränkung hinzugefügt, da meine Liste horizontal ist Höhenbeschränkung von 0). 

var visible:Bool = true{
        didSet{
            if(visible){
                clipsToBounds = false;
                removeConstraint(hideConstraint!)
            }else{
                clipsToBounds = true
                addConstraint(hideConstraint!)
            }
        }
    }

Sie müssen die Einschränkung der Breite mit null für die Ansicht initialisieren und als Feld hinzufügen:

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

Aufbauend auf der Antwort von Deniz, hier eine Lösung, die Einschränkungen in Swift verwendet

Beispiel: Wenn Sie 3 Ansichten haben, A_view B_view und C_view vertikal in dieser Reihenfolge ausgerichtet sind und Sie B ausblenden und die Differenz anpassen möchten, fügen Sie eine Einschränkung hinzu

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)

konstante ist (in diesem Fall) der vertikale Abstand zwischen C_view und A_view

0
The4thIceman