代码之家  ›  专栏  ›  技术社区  ›  Dani iman kazemayni

UIPageControl和UIScrollView不滚动

  •  1
  • Dani iman kazemayni  · 技术社区  · 7 年前

    我有一个相对简单的 UIViewController 用一个 UIScrollView 它占据了屏幕的一半 UIImageView 放置在 界面视图 那和 界面视图 .

    UIImageView视图 有一个 UIPageControl . 该点有一个水平滚动,并根据数组中的图像数量呈现一个像滑块一样的图像。问题是滚动视图没有滚动,我不知道为什么。

     @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var pageControl: UIPageControl!
    
    let imagelist = ["3.jpg", "1.jpg", "2.png", "4.png", "5.png"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self
        configurePageControl()
    
        for  i in stride(from: 0, to: imagelist.count, by: 1) {
            var frame = CGRect.zero
            frame.origin.x = self.scrollView.frame.size.width * CGFloat(i)
            frame.origin.y = 0
            frame.size = self.scrollView.frame.size
            scrollView.isPagingEnabled = true
            scrollView.isScrollEnabled = true
    
            let myImage:UIImage = UIImage(named: imagelist[i])!
            let bgColorFromImage = myImage.averageColor
            imageView.image = myImage
            imageView.contentMode = UIViewContentMode.scaleAspectFit
            imageView.frame = frame
    
    
            scrollView.backgroundColor = bgColorFromImage
            scrollView.addSubview(imageView)
        }
    
        self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * CGFloat(imagelist.count), height: self.scrollView.frame.size.height)
        pageControl.addTarget(self, action: #selector(changePage), for: UIControlEvents.valueChanged)
    
    }
    
    func configurePageControl() {
        self.pageControl.numberOfPages = imagelist.count
        self.pageControl.currentPage = 0
        self.pageControl.tintColor = UIColor.red
        self.pageControl.pageIndicatorTintColor = UIColor.black
        self.pageControl.currentPageIndicatorTintColor = UIColor.green
        self.imageView.addSubview(pageControl)
    }
    
    @objc func changePage() {
        let x = CGFloat(pageControl.currentPage) * scrollView.frame.size.width
        scrollView.setContentOffset(CGPoint(x: x,y :0), animated: true)
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
        pageControl.currentPage = Int(pageNumber)
    }
    

    这就是 UIStoryboard 看起来像:

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  1
  •   Shehata Gamal    7 年前

    在for循环中,使用相同的imageView对象,只设置帧和图像

    imageView.frame = frame
    imageView.image = myImage
    

    但您必须创建 UIImageView

    //

    假设您在IB中有一个scrollView,对superView有top、leading和trailing约束,高度为200,那么您可以像这样动态地添加imageview

    class ViewController: UIViewController {
    
        @IBOutlet weak var scrollView: UIScrollView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    
            for i in 0..<10 {
    
                let f = CGRect(x: CGFloat(i) * scrollView.frame.width, y: 0, width: scrollView.frame.width, height: scrollView.frame.height)
    
                let imgV = UIImageView(frame: f)
    
                imgV.image = UIImage(named: "re-fuel.png")
    
                scrollView.addSubview(imgV)
    
    
            }
    
            scrollView.contentSize = CGSize(width: CGFloat(10) * scrollView.frame.width, height: scrollView.frame.height)
        }
    }
    

    结果

    enter image description here

        2
  •  0
  •   matt    7 年前

    问题是滚动视图本身是用autolayout定位的。一旦你这样做,你就不能设置 contentSize 使滚动视图可滚动。必须使用内部约束来配置内容大小。