web-dev-qa-db-fra.com

Comment augmenter la hauteur d'UIView par programme avec Swift

A l'intérieur de l'IB, j'ai un viewController avec un segmentedControl et 2 containerViews. Dans chaque conteneurView, j'ai un tableView. À partir de chaque tableView, j'appuie sur une detailView. Ma mise en page automatique est dans IB.

Une fois que j'ai choisi un segment, je vois la table correspondante, je choisis une cellule et le détail correct est affiché dans la scène. 

Le problème est que, une fois que detailView est inséré, le segmentedControl est toujours visible. J'ai décidé de cacher le segmentedControl qui fonctionne, mais il y a un grand espace vide à cet endroit. J'ai essayé d'augmenter par programme la taille de la vue de detailView mais celle-ci ne se développe pas. D'après ce que j'ai lu, c'est parce que j'ai créé les contraintes initiales dans les scénarimages.

Comment obtenir par programme la vue de la vue détaillée à étendre?

code:

DetailViewController: UIViewController{

override func viewDidLoad() {
        super.viewDidLoad()

 //this isn't increasing the view's size
 self.view.frame.size.height += 20.0

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

 //doesn't work. I get an error on the last argument
 self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)
 }

}

Les erreurs:

//Error for the last argument- height: *self.view.frame.height += 20.0*
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

Le côté gauche de l'opérateur en mutation n'est pas modifiable: la «hauteur» est un get-only propriété

//Error for the last argument- *self.view.frame.size.height += 20.0*:
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.size.height += 20.0)

Impossible d'appeler l'initialiseur pour le type 'CGRect' avec une liste d'arguments de type '(x: Int, y: Int, largeur: CGFloat, hauteur: ())'

13
Lance Samaria

Vous devez créer un point de vente pour la contrainte de hauteur de la vue de détail, puis vous pouvez ajuster la hauteur par programmation comme suit: myHeightConstraint.constant += extraHeightextraHeight est un nombre indiquant la hauteur à laquelle vous souhaitez que la vue de détail soit. Vous devrez peut-être aussi appeler self.view.layoutIfNeeded() après.

Pour créer une sortie à partir d'une contrainte, faites glisser la contrainte depuis l'éditeur de storyboard (tout comme vous le feriez pour une sortie d'un UIView) dans votre code. 

Vous avez raison: comme vous utilisez la mise en page et les contraintes automatiques, les ajustements doivent également être effectués avec des contraintes. La définition des images brutes peut entraîner un comportement inattendu. Faites-moi savoir si vous avez d'autres questions ou difficultés. 

25
CoolPenguin

Dans l'initialiseur CGRect, vous ne devriez pas utiliser +=, mais simplement +.

Changement:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height += 20.0)

à:

self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + 20.0)

Vous ne devriez pas essayer de changer la valeur de self.view.frame.height dans l'initialiseur.

10
rmaddy

Existe-t-il des contraintes de hauteur définies pour segmentedControl, le cas échéant, si vous souhaitez les supprimer lors du chargement de la vue de détail

0
Joe

Swift 4.2

Je crée un exemple pour vous par programme: 

    var flowHeightConstraint: NSLayoutConstraint?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        view.addSubview(button)
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        button.widthAnchor.constraint(equalToConstant: 100).isActive = true
        flowHeightConstraint = button.heightAnchor.constraint(equalToConstant: 30)
        flowHeightConstraint?.isActive = true
    }

    @objc func animateButtonTapped() {
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
            self.flowHeightConstraint?.constant = 100
            self.view.layoutIfNeeded()
        }, completion: nil)
    }

    lazy var button: UIButton = {
       let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = .green
        button.addTarget(self, action: #selector(animateButtonTapped), for: .touchUpInside)
        return button
    }()

cette ligne de code crée un bouton et permet de changer la hauteur du bouton avec animation. 

espérons que cette aide :)

0
taha oraei