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;
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]];
fügen Sie Ihrer Ansicht eine Höhenbeschränkung hinzu:
nehmen Sie dann wie folgt einen Auslass für die Höhenbeschränkung in Ihrer viewController-Datei vor:
& dann ändern Sie in Ihrer viewDidLoad-Methode die Bedingungshöhe wie folgt in 0:
override func viewDidLoad() {
super.viewDidLoad()
nsLcButtonHeight.constant = 0
}
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!
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/
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.
https://github.com/tazihosniomar/LayoutManager
ich hoffe es hilft dir .
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];
}
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.
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
bConstraints
hinzu. Tun Sie dies durch: bConstraints
.@IBOutlet var bConstraints: [NSLayoutConstraint]!
in Ihrem ViewController erstelltDann verstecken Sie B
B.hidden = true
NSLayoutConstraint.deactivateConstraints(bConstraints)
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
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.
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)
...
}
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