0
votes

scrollview ne fonctionne pas si translatesAutoresizingMaskIntoConstraints = false

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)

 entrez la description de l'image ici

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.

entrez la description de l'image ici

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)
    }
}


2 commentaires

la vue de contenu est-elle créée à partir d'un point de vente?


oui, cela vient d'un point de vente


3 Réponses :


0
votes

Ajouter un cadre Scrollview lors de la création de

var scrollView: UIScrollView = {
    let scrollView = UIScrollView(frame:.zero)
    //other properties
    return scrollView
}()


3 commentaires

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.



0
votes

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)


2 commentaires

Erreur: CGRect n'a pas de taille de membre


Hmm ... CGRect a la propriété size, developer.apple.com/documentation/coregraphics/cgrect



1
votes

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


4 commentaires

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