Ich entwickle eine App für iOS und verwende das Storyboard mit aktiviertem AutoLayout. Einer meiner View Controller hat einen Satz von 4 Tasten, und unter bestimmten Umständen möchte ich die erste verschwinden lassen.
Wenn ich die setHidden:TRUE
Methode verwende, wird der UIButton unsichtbar, nimmt aber offensichtlich immer noch Platz in der Ansicht ein, und das Ergebnis ist ein "Loch", das ich nicht füllen konnte, sodass der verbleibende UIButton zum oberen Rand der Hauptansicht schwebt.
In Android mich einfach hätte verwendet View.GONE
statt View.INVISIBLE
, aber in iOS Ich bin fest mit diesem Verhalten , und ich will nicht glauben , dass die einzige Lösung ist , um manuell (ja , ich meine , programmatisch) bewegen , um die verbleibenden Elemente nach oben.
Ich dachte, ich hätte es geschafft, eine Art Einschränkung festzulegen, um alles so automatisch wie in Android zu machen, aber ich hatte kein Glück.
Kann mich jemand in die richtige Richtung weisen, bevor ich Autolayout ausschalte?
Ich benutze den IB, aber ich bin auch mit programmatischen Dingen vertraut.
AKTUALISIEREN:
Das Setzen der Komponentenhöhe auf 0 hilft ebenfalls nicht.
Ich habe so etwas versucht:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
quelle
Antworten:
Das Hinzufügen einer Einschränkung (NSLayoutAttributeHeight), mit der die Höhe der Ansicht auf 0 gesetzt wird, hat bei mir funktioniert:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
quelle
self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
Unable to simultaneously satisfy constraints
. während ich schon Einschränkungen für die Ansicht hatte. Ich löse es durch stackoverflow.com/a/38625419/1270901Alle Antworten auf diese Fragen sind ineffizient. Der beste Weg, um Android setVisibility gleichzusetzen: Die Methode unter iOS ist, dass
StackView
zuerst Komponenten ausgewählt und dann im Editor, eingebettet in, Stapelansicht,Verbinden Sie die neue Stapelansicht mit IBOutlet und folgen Sie dann:
versteckt:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = YES;
Sichtweite:
UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = NO;
Bei Verwendung der Stapelansicht bleiben alle Einschränkungen erhalten!
Dokument
quelle
Fügen Sie Ihrer Ansicht eine Höhenbeschränkung wie folgt hinzu:
Erstellen Sie dann einen Ausgang für die Höhenbeschränkung in Ihrer viewController-Datei wie folgt:
& Ändern Sie dann in Ihrer viewDidLoad-Methode die Einschränkungshöhe wie folgt auf 0:
override func viewDidLoad() { super.viewDidLoad() nsLcButtonHeight.constant = 0 }
quelle
Um die Androids.GONE-Funktionalität unter iOS zu erreichen, verwenden Sie eine UIStackView. Danach verstecken Sie das Kind nach Position. ( Äpfeldokumentation )
SWIFT 4:
let firstView = cell.rootStackView.arrangedSubviews[0] firstView.isHidden = true // first view gone
Es ist ein Beispiel für eine Tabellenzelle. Setzen Sie einfach beide Innenseiten ein
Stack view
und holen Sie sich ein Objekt fürGONE
das Kind.quelle
Sie können Ihre Ansichten unter einer Stapelansicht gruppieren. Wenn Sie dann eine bestimmte Ansicht ausblenden, werden die verbleibenden Ansichten automatisch verschoben, um den Bereich zu füllen.
Möglicherweise möchten Sie die Apple-Dokumentation zu Stapelansichten lesen: https://developer.apple.com/reference/uikit/uistackview
oder Online-Tutorials wie: https://www.appcoda.com/stack-views-intro/
quelle
1) Wenn Ihre Schaltflächen vertikal platziert sind, müssen Sie den
height
Wertwidth
auf 0 setzen. Bei horizontal platzierten Schaltflächen versuchen Sie, den Wert auf 0 zu setzen, oder Sie können beide auf 0 setzen.ODER
2) Sie könnten diesen Ansatz ausprobieren, der
button2
auf Folgendem setztbutton1
:- (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]; }
quelle
https://github.com/tazihosniomar/LayoutManager
ich hoffe es hilft dir .
quelle
Diese Frage ist ziemlich alt, aber der Schrank, den ich gefunden habe, setzt zusätzliche Einschränkungen (damit die Ansichten in der Ansicht "weg" wissen, was zu tun ist, wenn sie fehlen).
A which you want to be A | after setting B to gone | B C | C
bConstraints
. Tun Sie dies durch:bConstraints
.@IBOutlet var bConstraints: [NSLayoutConstraint]!
in Ihrem ViewController erstelltDann verstecke B.
B.hidden = true NSLayoutConstraint.deactivateConstraints(bConstraints)
Einblenden
B.hidden = false NSLayoutConstraint.activateConstraints(bConstraints)
Je mehr Ansichten Sie haben, desto komplexer wird dies natürlich, da Sie für jede Ansicht zusätzliche Einschränkungen benötigen
quelle
Outlet
aufOutlet Collection
. Für zusätzliche Einschränkungen ziehen Sie bei gedrückter Strg-Taste direkt auf den Variablennamen. Ich kann Sceenshots später heute (in ~ 8 Stunden)Wie meine Untersuchungen gezeigt haben, 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, aber Sie können diese sicher anpassen, um alle Schaltflächen rechts von Ihrer optionalen Schaltfläche zu verarbeiten ):
- (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 ist ratsam, die Höhe / Breite der optionalen Komponenten nicht fest zu codieren, da sonst Ihr Code bei jeder Bearbeitung des XIB / Storyboards unterbrochen wird. Ich habe ein Feld float _optionalHeight, das ich in viewDidLoad festgelegt habe, damit es immer auf dem neuesten Stand ist.
quelle
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, aber in diesem bereits vorhandenen Projekt gefunden, an dem ich arbeite. Erstellen
ManagementTableSection
undManagementTableCell
Klassen, um alles zu verwalten. Leider kann ich keinen besser definierten Code bereitstellen.quelle
Aufbauend auf der Antwort von Deniz finden Sie hier eine Lösung, die Einschränkungen in Swift verwendet
Beispiel: Wenn Sie drei Ansichten haben, A_view B_view und C_view vertikal in dieser Reihenfolge ausgerichtet sind und Sie B "ausblenden" und auch 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
quelle
Ich habe einer benutzerdefinierten UIView-Implementierung mit dem Namen "visible" eine neue Eigenschaft hinzugefügt, die, wenn sie auf "false" gesetzt ist, eine Einschränkung zum Reduzieren der Ansicht hinzufügt (ich habe nur eine Breitenbeschränkung hinzugefügt, da meine Liste horizontal ist, aber der beste Weg ist möglicherweise, eine hinzuzufügen 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 für die Breite Null in der 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) ... }
quelle
setHidden: TRUE / FALSE entspricht Android View.GONE / VISIBLE am nächsten.
Die Ansicht nimmt nicht unbedingt Platz ein, wenn sie nicht sichtbar ist!
Ich habe eine ComboBox-Alike mit einer ListView erstellt, die über anderen Ansichten liegt. Ich bin nur bei der Auswahl sichtbar:
quelle