J'ai quelques problèmes lors de l'utilisation de translatesAutoresizingMaskIntoConstraints. Je crée une vue de défilement dans laquelle vous pouvez faire glisser votre doigt vers la gauche ou la droite. Chaque fois que vous obtenez une autre image. Mais pour une raison quelconque, je ne peux pas faire glisser si translatesAutoresizingMaskIntoConstraints = false.
C'est avec translatesAutoresizingMaskIntoConstraints = false (dans ce cas, je ne peux pas glisser vers la gauche ou la droite)
Mais si je règle translatesAutoresizingMaskIntoConstraints = true, cela ressemble à ceci et je peux glisser vers la gauche et la droite. Le problème est que la mise en page est foirée.
Mon code:
var scrollView: UIScrollView = { let scrollView = UIScrollView() scrollView.showsHorizontalScrollIndicator = false scrollView.showsVerticalScrollIndicator = false scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.alwaysBounceVertical = false scrollView.alwaysBounceHorizontal = false scrollView.isPagingEnabled = true return scrollView }() override func viewDidLoad() { super.viewDidLoad() scrollView.frame = contentView.frame contentView.addSubview(scrollView) scrollView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true scrollView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true scrollView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true scrollView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true } var frame = CGRect.zero func viewTutorial() { for i in 0..<arrayOfTutorilImages.count { frame.origin.x = scrollView.frame.size.width * CGFloat((i)) frame.size = scrollView.frame.size let imageView = UIImageView(frame: frame) imageView.image = UIImage(named: arrayOfTutorilImages[i]) imageView.contentMode = .scaleAspectFit imageView.backgroundColor = .red imageView.translatesAutoresizingMaskIntoConstraints = false self.scrollView.addSubview(imageView) imageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true imageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true imageView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true } scrollView.contentSize = CGSize(width: (scrollView.frame.size.width * CGFloat(arrayOfTutorilImages.count)), height: scrollView.frame.size.height) scrollView.delegate = self } extension TutorialViewController: UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = scrollView.contentOffset.x / scrollView.frame.size.width pageControl.currentPage = Int(pageNumber) } }
3 Réponses :
Ajouter un cadre Scrollview lors de la création de
var scrollView: UIScrollView = { let scrollView = UIScrollView(frame:.zero) //other properties return scrollView }()
le même problème est toujours là après la modification de la propriété
pourquoi utilisez-vous cette configuration au lieu de UIcollectionView? Y a-t-il une exigence?
Ceci est issu d'un tutoriel, et je le prolonge un peu.
Contraintes ImageView identiques à celles de ScrollView. C'est la raison pour laquelle vous ne pouvez pas glisser, car toutes vos images ont les mêmes contraintes, et elles sont situées les unes sur les autres. Vous devriez faire comme:
imageView.translatesAutoresizingMaskIntoConstraints = true imageView.frame.size = contentView.frame.size imageView.frame.origin = CGPoint(x: imageIndex * contentView.frame.size.width, y: 0.0)
Erreur: CGRect n'a pas de taille de membre
Hmm ... CGRect a la propriété size, developer.apple.com/documentation/coregraphics/cgrect a>
Vous devez probablement ajouter des contraintes, vous pouvez essayer
class TutorialViewController: UIViewController { var scrollView: UIScrollView = { let scrollView = UIScrollView() scrollView.showsHorizontalScrollIndicator = false scrollView.showsVerticalScrollIndicator = false scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.alwaysBounceVertical = false scrollView.alwaysBounceHorizontal = false scrollView.isPagingEnabled = true return scrollView }() override func viewDidLoad() { super.viewDidLoad() contentView.addSubview(scrollView) scrollView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0).isActive = true scrollView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0).isActive = true scrollView.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0).isActive = true scrollView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0).isActive = true viewTutorial() } func viewTutorial() { var con:UIView = scrollView for i in 0..<arrayOfTutorilImages.count { let imageView = UIImageView(frame: CGRect.zero) imageView.image = UIImage(named: arrayOfTutorilImages[i]) imageView.contentMode = .scaleAspectFit imageView.backgroundColor = .red imageView.translatesAutoresizingMaskIntoConstraints = false self.scrollView.addSubview(imageView) if con == scrollView { imageView.leftAnchor.constraint(equalTo: con.leftAnchor, constant: 0).isActive = true } else { imageView.leftAnchor.constraint(equalTo: con.rightAnchor, constant: 0).isActive = true } imageView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 0).isActive = true if i == arrayOfTutorilImages.count - 1 { imageView.rightAnchor.constraint(equalTo: scrollView.rightAnchor, constant: 0).isActive = true } imageView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 0).isActive = true imageView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true con = imageView } scrollView.delegate = self } } extension TutorialViewController: UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = scrollView.contentOffset.x / scrollView.frame.size.width } }
Ne définissez pas de cadres lorsque vous utilisez des constructions
les contrôles de la page fonctionnent, mais l'image est trop grande
a ajouté imageView.widthAnchor.constraint (equalTo: view.widthAnchor, constant: 0) .isActive = true
lors de l'édition, réessayez
l'image a maintenant la bonne taille. Mais il y a encore un autre problème. Il y a un grand espace au-dessus et en dessous de l'image.
ok j'ai édité une heightAnchor et mis la contrainte equalTo: contentView
la vue de contenu est-elle créée à partir d'un point de vente?
oui, cela vient d'un point de vente