iOS Swift 는 UICollectionView 를 이용 하여 무한 윤방 기능(원리)에 대한 상세 한 설명 을 실현 합 니 다.

머리말
경험 이 풍부 한(자신 이 생각 하 는)iOS 프로그램 원숭이 로 서 윤파 도 를 자주 사용 합 니 다.지난번 에 UIScrollView 를 사용 하여 무한 윤파 효 과 를 실 현 했 습 니 다.이번 에는 Swift 언어 에서 저 는 UICollection View 를 사용 하여 무한 윤파 의 실현 원 리 를 다시 한 번 설명해 드 리 겠 습 니 다.
먼저 위의 그림:

UICollectionView-무한 윤 방.gif
우선 이 루어 져 야 할 것 은 바로 UICollection View 의 페이지 입 니 다.이것 은 간단 합 니 다.

collectionView.isPagingEnabled = true
다음은 원리 입 니 다.UICollection View 의 양 끝 에 두 장의 그림 을 추가 해 야 합 니 다.첫 번 째 부분 은 마지막 그림 을 추가 해 야 하고 끝 부분 은 첫 번 째 그림 을 추가 한 다음 중간 위치 에 한 번 에 각 그림 을 추가 해 야 합 니 다.이것 은 사실 실현 하기 쉽다.

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
 
 ///      (           )
 if (indexPath.row == 0) {
  cell.imageName = imageNameList.last
 } else if (indexPath.row == self.imageNameList.count + 1) {
  cell.imageName = imageNameList.first
 } else {
  cell.imageName = imageNameList[indexPath.row - 1]
 }
 
 return cell
 }
이렇게 미 끄 러 질 때 편 이 량 을 통 해 무한 윤방 의 효 과 를 실현 할 수 있다.미끄럼 이 멈 췄 을 때 편 이 량 을 판단 하고,편 이 량 이 0 일 때(보기 에 마지막 그림 이 표 시 됨),이때 편 이 량 을 조정 하 는 방법 을 직접 바 꾸 어 UICollection View 를 마지막 그림 의 위치 로 옮 깁 니 다.끝까지 미 끄 러 질 때 는 마찬가지다.

 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
 ///  UIScrollView         , UIScrollView       
 if (scrollView.contentOffset.x == 0) {
  scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
  self.pageControl.currentPage = self.imageNameList.count
  ///  UIScrollView          , UIScrollView       
 } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
  scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
  self.pageControl.currentPage = 0
 } else {
  self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
 }
 }
사실 원 리 는 매우 간단 합 니 다.개인 적 으로 UICollectionView 를 사용 하여 무한 윤방 을 실현 하 는 것 이 UIScrollView 보다 더욱 실 용적 이 고 유지 하기 편리 하 다 고 생각 합 니 다.다음 에 코드 를 모두 열거 하 겠 습 니 다.

import UIKit

let kScreenWidth = UIScreen.main.bounds.width

class ViewController: UIViewController {
 
 lazy var collectionView: UICollectionView = {
 let flowLayout = UICollectionViewFlowLayout()
 flowLayout.minimumLineSpacing = 0
 flowLayout.minimumInteritemSpacing = 0
 flowLayout.scrollDirection = .horizontal
 flowLayout.itemSize = CGSize(width: kScreenWidth, height: 200)
 
 let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 200), collectionViewLayout: flowLayout)
 
 collectionView.isPagingEnabled = true
 collectionView.showsHorizontalScrollIndicator = false
 collectionView.backgroundColor = UIColor.white
 collectionView.delegate = self
 collectionView.dataSource = self
 self.view.addSubview(collectionView)
 
 return collectionView
 }()
 
 lazy var pageControl: UIPageControl = {
 let pageControl = UIPageControl(frame: CGRect(x: 0, y: 150, width: kScreenWidth, height: 50))
 
 pageControl.numberOfPages = self.imageNameList.count
 pageControl.currentPage = 0
 
 pageControl.tintColor = UIColor.black
 pageControl.pageIndicatorTintColor = UIColor.gray;
 
 return pageControl;
 }()
 
 lazy var imageNameList: [String] = {
 let imageList = ["image0", "image1", "image2", "image3"]
 
 return imageList
 }()

 override func viewDidLoad() {
 super.viewDidLoad()
 
 setupController()
 }
 
 func setupController() {
 ///     
 collectionView.register(ImageCollectionViewCell.self, forCellWithReuseIdentifier: "ImageCollectionViewCell")
 
 collectionView.reloadData()
 collectionView.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
 
 self.view.addSubview(pageControl)
 }

}

extension ViewController: UICollectionViewDataSource {
 
 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
 ///         
 if (imageNameList.count == 0) {
  return 0
 }
 return imageNameList.count + 2
 }
 
 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
 
 ///      (           )
 if (indexPath.row == 0) {
  cell.imageName = imageNameList.last
 } else if (indexPath.row == self.imageNameList.count + 1) {
  cell.imageName = imageNameList.first
 } else {
  cell.imageName = imageNameList[indexPath.row - 1]
 }
 
 return cell
 }
 
}

extension ViewController: UICollectionViewDelegate {
 
 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
 ///  UIScrollView         , UIScrollView       
 if (scrollView.contentOffset.x == 0) {
  scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
  self.pageControl.currentPage = self.imageNameList.count
  ///  UIScrollView          , UIScrollView       
 } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
  scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
  self.pageControl.currentPage = 0
 } else {
  self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
 }
 }
 
}

/// collectionView   cell
class ImageCollectionViewCell: UICollectionViewCell {
 
 ///      
 let imageView = UIImageView()
 var imageName: String? = "" {
 didSet {
  if let name = imageName {
  imageView.image = UIImage(named: name)
  }
 }
 }
 
 override init(frame: CGRect) {
 super.init(frame: frame)
 
 setupCell();
 }
 
 ///      
 func setupCell() {
 imageView.frame = self.bounds
 contentView.addSubview(imageView)
 }
 
 required init?(coder aDecoder: NSCoder) {
 fatalError("init(coder:) has not been implemented")
 } 
}
ok,마음 에 드 시 면 컬 렉 션 을 눌 러 보 세 요.UIScrollView 로 윤 방 을 실현 하 는 원 리 는 다음 과 같 습 니 다.https://www.jb51.net/article/148185.htm필요 하 시 면 알 아 보 세 요.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기