【问题标题】:UIPageControl and UIScrollView not scrollingUIPageControl 和 UIScrollView 不滚动
【发布时间】:2019-01-11 12:07:33
【问题描述】:

我有一个相对简单的UIViewController,其中UIScrollView 占据了屏幕的一半,UIImageView 放置在UIScrollView 内,与UIScrollView 的大小完全相同。

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 的样子:

【问题讨论】:

  • 滚动视图什么时候不滚动?当用户尝试水平滑动时,还是仅在用户点击页面控件时?
  • @matt 真的。

标签: ios swift uiscrollview uipagecontrol


【解决方案1】:

在 for 循环中你使用 imageView 的同一个对象,你只设置框架和图像

imageView.frame = frame
imageView.image = myImage

但您必须创建UIImageView 的新实例

//

假设您在 IB 中有一个 scrollView ,它对 superView 具有 top 、前导和尾随约束,并且高度为 200 ,您可以像这样动态添加 imageViews

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

结果

【讨论】:

  • 这很有帮助!谢谢
【解决方案2】:

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

【讨论】:

  • 哦,是的,就是这样!谢谢
  • 顺便说一下,viewDidLoad 是配置滚动视图内部的一个非常糟糕的地方,因为frame 还不是正确的。
  • 不正确的设置contentSize会改变框架
  • 现在我很困惑哈哈它会改变框架还是不会?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2015-09-02
  • 2011-07-02
相关资源
最近更新 更多