J'ai ajouté une sous-vue scrollview dans l'une de mes vues, mais j'ai du mal à obtenir sa hauteur pour qu'elle corresponde exactement au contenu affiché par le scrollview, qui est du texte dans UILabel. La hauteur doit être dynamique (c'est-à-dire un facteur de la longueur du texte), car j'instancie cette vue pour de nombreuses longueurs de texte différentes. Chaque fois que je me connecte label.frame.bounds
, je récupère (0,0). J'ai également essayé sizeToFits()
dans quelques endroits sans beaucoup de chance.Comment dimensionner un UIScrollView pour ajuster une quantité inconnue de texte dans un UILabel?
Mon but est d'obtenir la fin de la scrollview quand elle atteint la dernière ligne de texte. En outre, j'utilise uniquement des contraintes programmatiques.
Une version condensée de mon code est le suivant:
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
let containerView = UIView()
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
// This needs to change
scrollView.contentSize = CGSize(width: 375, height: 1000)
scrollView.addSubview(containerView)
view.addSubview(scrollView)
label.text = unknownAmountOfText()
label.backgroundColor = .gray
containerView.isUserInteractionEnabled = true
containerView.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.frame = view.bounds
containerView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)
}
}
Toute aide est appréciée.
solution trouvée:
func heightForLabel(text: String, font: UIFont, lineHeight: CGFloat, width: CGFloat) -> CGFloat {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.setLineHeight(lineHeight: lineHeight)
label.sizeToFit()
return label.frame.height
}
Je trouve cette solution en ligne, qui me donne ce que je dois définir la taille du contenu approprié pour la hauteur ScrollView fonction de la taille de l'étiquette. Idéalement, je serais capable de le déterminer sans cette fonction, mais pour l'instant je suis satisfait.
Pourquoi faites-vous ce programme plutôt que dans le constructeur d'interface? Le moyen le plus simple de gérer cela est d'utiliser des contraintes de mise en page, bien que cela puisse devenir très vite laid dans le code. –
Pourquoi mettez-vous UILabel dans un UIScrollView, puis essayez de redimensionner la vue de défilement pour l'adapter à l'étiquette? Voulez-vous faire défiler? Si oui, pourquoi redimensionner l'affichage déroulant? Si vous ne voulez pas faire défiler, pourquoi mettre l'étiquette dans une vue déroulante? – DonMag
Je voulais essayer un projet uniquement avec des mises en page programmatiques. Je pense que dans mon prochain projet j'utiliserai l'interface constructeur. Mais pour l'instant, je suis trop profond dans ce projet pour changer, donc j'ai besoin de comprendre cela par programme. –