Chris
Chris

Reputation: 2284

Swift - remove/add UIView from superView

In my project I have UIView called MakeWishView which I let appear by the tap of a button like this:

@objc private func addWishButtonTapped(){
    print("addWishButton tapped")
    
    view.addSubview(makeWishView)
    
    makeWishView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    makeWishView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    makeWishView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    makeWishView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    
    makeWishView.grayView.transform =  CGAffineTransform(scaleX: 1.3, y: 1.3)
    makeWishView.visualEffectView.alpha = 0
    makeWishView.grayView.alpha = 0
    makeWishView.wishButton.alpha = 0
    makeWishView.closeButton.alpha = 0
    makeWishView.dropDownButton.alpha = 0
    makeWishView.wishNameTextField.alpha = 0
    makeWishView.wishImage.alpha = 0
    makeWishView.wishImageButton.alpha = 0
    makeWishView.linkTextField.alpha = 0
    makeWishView.priceTextField.alpha = 0
    makeWishView.noteTextField.alpha = 0
    makeWishView.linkImage.alpha = 0
    makeWishView.priceImage.alpha = 0
    makeWishView.noteImage.alpha = 0
    
        
    UIView.animate(withDuration: 0.3) {
        
        self.makeWishView.visualEffectView.alpha = 1
        self.makeWishView.grayView.alpha = 1
        self.makeWishView.wishButton.alpha = 1
        self.makeWishView.closeButton.alpha = 1
        self.makeWishView.dropDownButton.alpha = 1
        self.makeWishView.wishNameTextField.alpha = 1
        self.makeWishView.wishImage.alpha = 1
        self.makeWishView.wishImageButton.alpha = 1
        self.makeWishView.linkTextField.alpha = 1
        self.makeWishView.priceTextField.alpha = 1
        self.makeWishView.noteTextField.alpha = 1
        self.makeWishView.linkImage.alpha = 1
        self.makeWishView.priceImage.alpha = 1
        self.makeWishView.noteImage.alpha = 1
        
        self.makeWishView.grayView.transform = CGAffineTransform.identity
    }
    
}

And I dismiss the view like this:

func dismissView(){
    UIView.animate(withDuration: 0.3, animations: {
        self.grayView.transform =  CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.visualEffectView.alpha = 0
        self.grayView.alpha = 0
        self.wishButton.alpha = 0
        self.closeButton.alpha = 0
        self.dropDownButton.alpha = 0
        self.wishNameTextField.alpha = 0
        self.wishImage.alpha = 0
        self.wishImageButton.alpha = 0
        self.linkTextField.alpha = 0
        self.priceTextField.alpha = 0
        self.noteTextField.alpha = 0
        self.linkImage.alpha = 0
        self.priceImage.alpha = 0
        self.noteImage.alpha = 0
    }) { (_) in
        self.visualEffectView.removeFromSuperview()
        self.grayView.removeFromSuperview()
        self.wishButton.removeFromSuperview()
        self.closeButton.removeFromSuperview()
        self.dropDownButton.removeFromSuperview()
        self.wishNameTextField.removeFromSuperview()
        self.wishImage.removeFromSuperview()
        self.wishImageButton.removeFromSuperview()
        self.linkTextField.removeFromSuperview()
        self.priceTextField.removeFromSuperview()
        self.noteTextField.removeFromSuperview()
        self.linkImage.removeFromSuperview()
        self.priceImage.removeFromSuperview()
        self.noteImage.removeFromSuperview()
        self.removeFromSuperview()
    }
}

The problem is that if I want click on the addWishButton again the MakeWishView does not get displayed but instead an empty view:

enter image description here

I guess I am having a simple misunderstanding on how to dismiss or add a UIView. Appreciate any help :)

Upvotes: 1

Views: 229

Answers (2)

Amr El-Sayed
Amr El-Sayed

Reputation: 404

Why do you remove the following views from their superview ? I couldn't see that you add them again

{ (_) in
    self.visualEffectView.removeFromSuperview()
    self.grayView.removeFromSuperview()
    self.wishButton.removeFromSuperview()
    self.closeButton.removeFromSuperview()
    self.dropDownButton.removeFromSuperview()
    self.wishNameTextField.removeFromSuperview()
    self.wishImage.removeFromSuperview()
    self.wishImageButton.removeFromSuperview()
    self.linkTextField.removeFromSuperview()
    self.priceTextField.removeFromSuperview()
    self.noteTextField.removeFromSuperview()
    self.linkImage.removeFromSuperview()
    self.priceImage.removeFromSuperview()
    self.noteImage.removeFromSuperview()
    self.removeFromSuperview()
}

I think you just need to call the following instead:

{ (_) in

    self.removeFromSuperview()

}

Upvotes: 1

Shehata Gamal
Shehata Gamal

Reputation: 100523

You remove the subviews here

    self.visualEffectView.removeFromSuperview()
    self.grayView.removeFromSuperview()
    self.wishButton.removeFromSuperview()
    self.closeButton.removeFromSuperview()
    self.dropDownButton.removeFromSuperview()
    self.wishNameTextField.removeFromSuperview()
    self.wishImage.removeFromSuperview()
    self.wishImageButton.removeFromSuperview()
    self.linkTextField.removeFromSuperview()
    self.priceTextField.removeFromSuperview()
    self.noteTextField.removeFromSuperview()
    self.linkImage.removeFromSuperview()
    self.priceImage.removeFromSuperview()
    self.noteImage.removeFromSuperview()
    self.removeFromSuperview()

You need to make the declare of the view a computed property instead of a stored one like

var makeWishView:MakeWishView {
     ....
    return 
}

or do this only inside the animation completion

 self.removeFromSuperView()

and set back alpha = 1

Upvotes: 1

Related Questions