scrollview не работает, если translatesAutoresizingMaskIntoConstraints = false - PullRequest
0 голосов
/ 08 марта 2020

У меня есть некоторые проблемы с использованием translatesAutoresizingMaskIntoConstraints. Я создаю прокрутки, где вы можете провести влево или вправо. Каждый раз, когда вы получаете другое изображение. Но по какой-то причине я не могу провести, если translatesAutoresizingMaskIntoConstraints = false.

Это с translatesAutoresizingMaskIntoConstraints = false (в этом случае я не могу провести пальцем влево или вправо)

enter image description here

Но если я установлю translatesAutoresizingMaskIntoConstraints = true, это будет выглядеть так, и я могу провести пальцем влево и вправо. Проблема в том, что макет испорчен.

enter image description here

Мой код:

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 ]

1 голос
/ 08 марта 2020

Возможно, вам нужно добавить ограничения. Вы можете попробовать

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

     }
 }

Не устанавливать кадры при использовании ограничений

0 голосов
/ 08 марта 2020

Ограничения ImageView такие же, как для ScrollView. Вот почему вы не можете провести пальцем, потому что все ваши изображения имеют одинаковые ограничения, и они расположены один над другим. Вы должны сделать что-то вроде:

imageView.translatesAutoresizingMaskIntoConstraints = true
imageView.frame.size = contentView.frame.size
imageView.frame.origin = CGPoint(x: imageIndex * contentView.frame.size.width, y: 0.0)

0 голосов
/ 08 марта 2020

Добавить кадр прокрутки при создании

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