首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CollectionView +页面控制

CollectionView +页面控制
EN

Stack Overflow用户
提问于 2021-02-08 11:28:40
回答 2查看 273关注 0票数 0

我有collectionView,每个单元格都是一个页面(单元格在纵向模式下占据整个屏幕,在景观模式下占据2个单元格)。我试图添加当前的页码/总页数(即1/30) ->一个是当前的页码,0是总页数。

有两个问题:

  • 只有当我开始滚动
  • 时,当我滚动当前页码不改变时,页面总数才会出现。

我使用的代码:

代码语言:javascript
复制
func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if pageControl.currentPage < pages.count {
                   pageControl.currentPage += 1
                    numberOfPagesLabel.text = "\(pageControl.currentPage + 1)/\(pages.count)"
        } else if pageControl.currentPage != 0 {
                    pageControl.currentPage -= 1
                    numberOfPagesLabel.text = "\(pageControl.currentPage - 1)/\(pages.count)"
                }
    }
代码语言:javascript
复制
class DetailsViewController: UIViewController, UICollectionViewDelegate,  UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate  {

     private var collectionView: UICollectionView!
    
    let pageControl = UIPageControl (frame: CGRect(x: 20, y: 120, width: 44, height: 44))
    let numberOfPagesLabel = UILabel (frame: CGRect(x: 20, y: 0, width: 44, height: 44))

    
    private var pages = [Pages]() {
      didSet {
        DispatchQueue.main.async {
          self.collectionView.reloadData()
        }
      }
    }
    
     override func viewDidLoad() {
         super.viewDidLoad()
      
        numberOfPagesLabel.layer.cornerRadius = 15.0
        numberOfPagesLabel.clipsToBounds = true
        numberOfPagesLabel.center.x = self.view.center.x
        numberOfPagesLabel.center.y = self.view.center.y+350

         
         self.view.addSubview(collectionView)
        self.view.addSubview(pageControl)
        self.view.addSubview(numberOfPagesLabel)

     }

         override func viewDidAppear(_ animated: Bool) {
           super.viewDidAppear(true)
            
            collectionViewLayout()
            collectionView.delegate = self
            collectionView.dataSource = self

            }
  

    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if pageControl.currentPage < pages.count {
                   pageControl.currentPage += 1
                    numberOfPagesLabel.text = "\(pageControl.currentPage + 1)/\(pages.count)"
        } else if pageControl.currentPage != 0 {
                    pageControl.currentPage -= 1
                    numberOfPagesLabel.text = "\(pageControl.currentPage - 1)/\(pages.count)"
                }
    }
    
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pages.count
         }


     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colCell7", for: indexPath) as! colCell7
        
         let book = pages[indexPath.row]
         cell.setupCell(for: book)
         return cell
     }



     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        if UIWindow.isLandscape {
            return CGSize(width: (collectionView.frame.size.width)/2, height: (collectionView.frame.size.height))
        }

        else {            return CGSize(width: (collectionView.frame.size.width), height: (collectionView.frame.size.height))
        }
    }

    
 func collectionViewLayout() {
        
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: layout)
       collectionView.backgroundColor = .white

       collectionView.showsHorizontalScrollIndicator = false
       collectionView.showsVerticalScrollIndicator = false
       collectionView.isPagingEnabled = true


        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.register(colCell7.self, forCellWithReuseIdentifier: "colCell7")
        collectionView.isScrollEnabled = true
       collectionView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
       layout.itemSize = CGSize(width: view.frame.width, height: view.frame.height)
              layout.minimumLineSpacing = 0
              layout.minimumInteritemSpacing = 0
       layout.itemSize = CGSize(width: view.frame.width/2, height:view.frame.height )
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-08 21:47:01

我想通了。下面的代码适用于景物造景(2个单元格)和肖像画(1个单元格),我仍然有一个问题--直到滚动开始,计数才会出现。

代码语言:javascript
复制
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        if UIWindow.isLandscape {
            let x = scrollView.contentOffset.x
            let w = scrollView.bounds.size.width/2
            let currentPage = Int(ceil(x/w))
        numberOfPagesLabel.text = "\(self.pages.count)/\(currentPage + 2)"
                        pageControl.currentPage = Int(currentPage)        }
        else
        {
            let x = scrollView.contentOffset.x
            let w = scrollView.bounds.size.width
            let currentPage = Int(ceil(x/w))
        numberOfPagesLabel.text = "\(self.pages.count)/\(currentPage + 1)"
                        pageControl.currentPage = Int(currentPage)
        }
代码语言:javascript
复制
extension UIWindow {
    static var isLandscape: Bool {
        if #available(iOS 13.0, *) {
            return UIApplication.shared.windows
                .first?
                .windowScene?
                .interfaceOrientation
                .isLandscape ?? false
        } else {
            return UIApplication.shared.statusBarOrientation.isLandscape
        }
    }

}
票数 0
EN

Stack Overflow用户

发布于 2021-02-08 11:37:23

试试下面的代码,以便在CollectionView中获取CollectionView:

代码语言:javascript
复制
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // for horizontal scroll
    let currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)
    
  // for vertical scroll
//    let currentPage = Int(scrollView.contentOffset.y) / Int(scrollView.frame.height)
    
    pageControl.currentPage = currentPage
        
numberOfPagesLabel.text = "\(self.pages.count)/\(self.pageControl.currentPage - 1)"
}

最好在scrollViewDidEndDecelerating功能中添加计算器代码,以便在滚动结束时检测当前页面。

完整代码:

代码语言:javascript
复制
public struct Pages {
    public var title: String
}

class DetailsViewController: UIViewController, UICollectionViewDelegate,  UICollectionViewDataSource, UICollectionViewDelegateFlowLayout  {
    
    private var collectionView: UICollectionView!
    
    let pageControl = UIPageControl (frame: CGRect(x: 20, y: 120, width: 44, height: 44))
    let numberOfPagesLabel = UILabel (frame: CGRect(x: 20, y: 0, width: 44, height: 44))
    
    
    private var pages = [Pages]() {
        didSet {
            DispatchQueue.main.async {
                self.collectionView.reloadData()
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.numberOfPagesLabel.textColor = .red
        self.numberOfPagesLabel.backgroundColor = .blue
        
        collectionViewLayout()
        collectionView.delegate = self
        collectionView.dataSource = self
        
        self.view.addSubview(collectionView)
        self.view.addSubview(pageControl)
        self.view.addSubview(numberOfPagesLabel)
        
        numberOfPagesLabel.translatesAutoresizingMaskIntoConstraints = false
        numberOfPagesLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 20).isActive = true
        numberOfPagesLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true
        
        
        self.collectionView.register(UINib.init(nibName: "colCell7", bundle: nil), forCellWithReuseIdentifier: "colCell7")
        numberOfPagesLabel.layer.cornerRadius = 15.0
        numberOfPagesLabel.clipsToBounds = true
        numberOfPagesLabel.center.x = self.view.center.x
        numberOfPagesLabel.center.y = self.view.center.y+350
        
        collectionView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
        collectionView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
        collectionView.heightAnchor.constraint(equalTo: self.view.heightAnchor).isActive = true
        collectionView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
        
        pages = [.init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),.init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1"),
                 .init(title: "1")]
        
        pageControl.numberOfPages = pages.count
        
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pages.count
    }
    
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "colCell7", for: indexPath) as! colCell7
        
        let book = pages[indexPath.row]
        cell.setupCell(pages: book)
        
        return cell
    }
    
    public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // for horizontal scroll
        let currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width)
        
      // for vertical scroll
    //    let currentPage = Int(scrollView.contentOffset.y) / Int(scrollView.frame.height)
        
        pageControl.currentPage = currentPage
            
    numberOfPagesLabel.text = "\(self.pages.count)/\(currentPage)"
    }
    
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        
        return CGSize(width: (collectionView.frame.size.width), height: (collectionView.frame.size.height))
    }
    
    
    func collectionViewLayout() {
        
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: layout)
        collectionView.backgroundColor = .white
        
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.showsVerticalScrollIndicator = false
        collectionView.isPagingEnabled = true
        
        
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.isScrollEnabled = true
        layout.itemSize = CGSize(width: view.frame.width, height: view.frame.height)
        layout.minimumLineSpacing = 0
        layout.minimumInteritemSpacing = 0
        layout.itemSize = CGSize(width: view.frame.width/2, height:view.frame.height )
    }
}

产出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66100753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档