Search code examples
iosxcodepaginationuiscrollview

Paging by scrollView incorrect displayed


I don't understand why the iPhone 4,7 is displayed correctly, but on iphone 5,5 is not displayed correctly. I want make paging by ScrollView.

What should I do to be displayed correctly on all devices?

func showScrollView() {
        var photoSlides = [Slides]()
        for image in photo {
            let slide: Slides = Bundle.main.loadNibNamed("Slide", owner: self, options: nil)?.first as! Slides
            slide.slideImage.image = image.image
            photoSlides.append(slide)
        }
        setupSlideScrollView(slides: photoSlides)
    }

    func setupSlideScrollView(slides : [Slides]) {
        scrollView.contentSize = CGSize(width: scrollView.frame.width * CGFloat(slides.count), height: 200)
        scrollView.isPagingEnabled = true

        for i in 0 ..< slides.count {
            slides[i].frame = CGRect(x: scrollView.frame.width * CGFloat(i), y: 0, width: scrollView.frame.width, height: scrollView.frame.height)
            scrollView.addSubview(slides[i])
        }
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let pageIndex = round(scrollView.contentOffset.x/scrollView.frame.width)
        pageControl.currentPage = Int(pageIndex)
    }

https://yadi.sk/i/ipS5WchP3aRtZ9 - correctly (iPhone 8)

https://yadi.sk/i/SPmriRFn3aRtgL - not correctly (iPhone 8 Plus)


Solution

  • If you have used storyboard or xib to design your UI, and then for some portion of your screen you want frame size to calculate frame of other controls then you have to use layoutIfNeeded method on that control. i.e in your case you can do something like below

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated) 
    
        scrollView.layoutIfNeeded()
    
        // THEN CALL YOUR FUNCTION WHICH SETUP YOUR OTHER VIEWS
        showScrollView()
    }