2015-06-04 16 views
6

spero che il titolo fosse chiaro. Voglio nascondere un elemento (selettore dati nel mio caso) e voglio anche nascondere il suo spazio. Così ho provato questo con un'animazione:Swift come nascondere l'elemento e il suo spazio

@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) 
     }) 
    } 
} 

Ho anche provato qualcosa di simile:

self.pickerQnt.hidden = true 

ma non funzionerà.

Grazie in anticipo.

risposta

5

L'utilizzo di "hidden" property sulle viste in Objective-C/Swift non fa infatti "collassare" lo spazio occupato dalla vista (al contrario di "View.GONE" in Android).

Invece è necessario utilizzare il rollout automatico e un vincolo di altezza.

Creare un vincolo di altezza nel file Xib/Storyboard. Dandogli l'altezza desiderata. Fare un IBOutlet a quel vincolo (ctrl-trascinamento dal vincolo nella lista vincoli per il file sorgente), e quindi si può scrivere questo metodo

soluzione Swift

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

soluzione Objective-C :

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

NEGAZIONE: non ho ancora testato né compilato il codice di cui sopra, ma che vi darà un'idea di come raggiungerlo.

IMPORTANTE: il codice precedente presuppone che si attribuisca al vincolo di altezza del raccoglitore un valore maggiore di 0 nello storyboard/pennino.

+0

Risolto, grazie! –