iOS Swift 는 UICollectionView 를 이용 하여 무한 윤방 기능(원리)에 대한 상세 한 설명 을 실현 합 니 다.
7229 단어 swiftuicollectionview무한 윤파
경험 이 풍부 한(자신 이 생각 하 는)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필요 하 시 면 알 아 보 세 요.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백그라운드에서 값을 계산하고 Swift 동시성 이후에 결과 사용값을 계산해야 하고 메인 스레드를 차단하지 않으려면 계산된 값을 반환하는 Swift Task 구조에서 해당 값을 계산하면 됩니다. Swift 동시성 이전에는 백그라운드 대기열로 이동하여 필요한 값을 계산하고 필요한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.