2015-06-04 9 views
6

Ich hoffe, dass der Titel klar war. Ich möchte ein Element verstecken (Datenpicker in meinem Fall) und ich möchte auch seinen Platz verstecken. Also habe ich versucht, dies mit einer Animation:Swift, wie Element und seinen Raum zu verbergen

self.pickerQnt.hidden = true 

aber nicht funktionieren:

@IBAction func showQnt(sender: AnyObject) { 
    if (self.pickerQnt.alpha == 0.0){ 
     UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.ShowHideTransitionViews, animations: { 
      self.pickerQnt.alpha = 1.0 


      }, completion: { 
       (finished: Bool) -> Void in 
       //var constH = NSLayoutConstraint(item: self.pickerQnt, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 162) 
       //self.pickerQnt.addConstraint(constH) 
     }) 
    } else { 
     UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.ShowHideTransitionViews, animations: { 
      self.pickerQnt.alpha = 0.0 


      }, completion: { 
      (finished: Bool) -> Void in 
       // CHECK: ?!? constrain to set view height to 0 run time 
       //var constH = NSLayoutConstraint(item: self.pickerQnt, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) 
       //self.pickerQnt.addConstraint(constH) 
     }) 
    } 
} 

ich auch so etwas wie ausprobiert habe.

Vielen Dank im Voraus.

Antwort

5

Die Verwendung der "hidden" property auf Ansichten in Objective-C/Swift in der Tat nicht "kollabieren" den Raum, den die Ansicht nimmt (im Gegensatz zu "View.GONE" in Android).

Stattdessen sollten Sie Autolayout und eine Höhenbeschränkung verwenden.

Erstellen Sie eine Höhenbeschränkung in Ihrer Xib/Storyboard-Datei. Gib es die gewünschte Höhe. Vereinbaren Sie einen IBOutlet zu dieser Einschränkung (ctrl-Ziehen aus der Constraint in der Constraints Liste der Quelldatei), und dann können Sie diese Methode

var pickerHeightVisible: CGFloat! 
... 
... 
func togglePickerViewVisibility(animated: Bool = true) { 
    if pickerHeightConstraint.constant != 0 { 
     pickerHeightVisible = pickerHeightConstraint.constant 
     pickerHeightConstraint.constant = 0 
    } else { 
     pickerHeightConstraint.constant = pickerHeightVisible 
    } 
    if animated { 
     UIView.animateWithDuration(0.2, animations: { 
      () -> Void in 
       self.view.layoutIfNeeded() 
     }, completion: nil) 
    } else { 
     view.layoutIfNeeded() 
    } 
} 

Objective-C-Lösung Swift Lösung schreiben :

@property (nonatomic, strong) CGFloat pickerHeightVisible; 
... 
... 
- (void)togglePickerViewVisibility:(BOOL)animated { 
    if(pickerHeightConstraint.constant != 0) { 
     pickerHeightVisible = pickerHeightConstraint.constant; 
     pickerHeightConstraint.constant = 0; 
    } else { 
     pickerHeightConstraint.constant = pickerHeightVisible; 
    } 
    if(animated) { 
     [UIView animateWithDuration:0.2 
      animations:(void (^)(void))animations:^(void) { 
        [self.view layoutIfNeeded]; 
      }]; 
    } else { 
      [self.view layoutIfNeeded]; 
    } 
} 

HAFTUNGSAUSSCHLUSS: ich habe nicht getestet noch den oben stehenden Code kompiliert wird, aber es wird Ihnen eine Idee, wie man es erreicht.

WICHTIG: Der obige Code geht davon aus, dass Sie der Höhenkontrolle der Auswahlansicht einen Wert größer als 0 im Storyboard/der Schreibfeder geben.

+0

Gelöst, danke! –