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: ())'
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 += extraHeight
où extraHeight
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.
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.
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
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 :)