- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS Swift利用UICollectionView实现无限轮播功能(原理)详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
作为一个资深(自认为)ios程序猿,会经常用到轮播图,上一次使用uiscrollview实现无限轮播的效果,这一次在swift语言中,我使用uicollectionview再为大家讲解一次无限轮播的实现原理.
先上图:
uicollectionview-无限轮播.gif 。
首先需要实现了就是uicollectionview的分页,这个很简单:
1
|
collectionview.ispagingenabled =
true
|
接下来就是原理,在uicollectionview的两端需要先添加两张图片,首段需要添加最后一张图片,而尾端需要添加第一张图片,然后在中间的位置上一次添加各个图片。这个其实是很容易实现的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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时(视图上显示的是最后一张图片),这时候就直接调动调整偏移量的方法,把uicollectionview偏移到最后一张图片的位置。滑动到尾端时是同理.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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更加实用并且便于维护,接下来我将代码全部列一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
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实现轮播的原理在:http://www.zzvips.com/article/163332.html,大家需要的话也可以了解一下.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://www.jianshu.com/p/0ba33e59a784 。
最后此篇关于iOS Swift利用UICollectionView实现无限轮播功能(原理)详解的文章就讲到这里了,如果你想了解更多关于iOS Swift利用UICollectionView实现无限轮播功能(原理)详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个并排有两列的布局。有没有一种简单的方法可以使用单个 UICollectionView 来做到这一点?唯一的要求是该解决方案必须适用于 iOS 8,并且单元格必须在每列中垂直堆叠,如下所示:
我使用标准 UICollectionView与部分。我的单元格像网格一样排列。如果用户使用 Apple TV Remote 移动焦点,则所选方向的下一个单元格会正确聚焦。但是如果网格中有“间隙”,默认
这是我的 ImageController 类(一个 ViewController)仅显示 Collection View 的背景,而其中的单元格则不显示。有什么帮助吗?是不是我没有正确初始化什么? 这
我希望能够在 UICollectionView 中设置内容大小的最小高度,这样我就可以隐藏/显示 UISearchbar,类似于在 iBooks 上完成的方式。 但是,我不想对布局进行子类化,因为我想
有没有办法禁用 UICollectionView 的自动滚动细胞何时聚焦?当单元格进入焦点时,我想手动调整单元格的内容偏移量。 我不想更新内容偏移量: - (void)didUpdateFocusIn
如何将 UICollectionView 中的所有单元格垂直和水平居中使用 UICollectionViewFlowLayout ? 流布局根据滚动方向在右侧或底部留下间距。我想在所有方面设置相同的填
所以这是一个很无聊的问题,但我只是想不出一种非常简单的方法来检测当前关注的项目的 indexPath . 我环顾四周,希望看到一些非常简单的东西,例如 collectionView.indexPath
每当 UICollectionView 完全加载时,我都必须执行一些操作,即此时应调用所有 UICollectionView 的数据源/布局方法。我怎么知道?是否有任何委托(delegate)方法可以
每当 UICollectionView 完全加载时,我都必须执行一些操作,即此时应调用所有 UICollectionView 的数据源/布局方法。我怎么知道?是否有任何委托(delegate)方法可以
所以,UICollectionView 现在对我来说真的很痛苦。假设我有一个 UIViewController ,其中嵌入了一个 UICollectionView 。 CollectionView 的
好的,如果我有 UIViewController如果我使用这个 `preferredFocusedView ,我可以制作一个专注于 tvOS 的 View ,但是如何让 UICollectionVie
我已经构建了 2 个 Collection View ,1 个水平滚动(在顶部)和 1 个垂直滚动(在中间 - 底部),用于在我的 Objective-C iOS 应用程序中查看 2 组不同的内容,类
这就是我的问题,您在 gif 上看到的 4 个橙色矩形是单个垂直 UICollectionView = OrangeCollectionView。 绿色和紫色“卡片” View 是另一个 UIColl
大家好,我是 IOS 开发的新手,我有一个 UICollection,我在其中使用 SDWebImageCache 加载图像。问题是我的 UICollectionview 单元格在快速滚动时感觉像抽搐
我在 ViewController 中有两个 Collection View 。需要在用户滚动底部 UICollectionView 时自动滚动顶部 collectionView。 最佳答案 你可以试
我正在研究 UICollectionView,我有一个在单元格中使用 collectionView 的想法?可以吗 当我运行项目时,我收到一个错误 "InterFace Builder StoryBo
大家好,我收到以下错误 -UICollectionView 必须使用非 nil 布局参数进行初始化 PopularShotsCollectionViewController 的代码: import U
我的应用程序出现此错误: *** -[UICollectionView _endItemAnimations] 断言失败,/SourceCache/UIKit/UIKit-2372/UICollect
当我的 UIViewController 与 UICollectionView 一起出现时,内容会向上滚动一点,出现时。 我实现了 scrollViewDidScroll:我正在记录 contentO
我遇到了一个问题,在我的 UICollectionView 中,当返回的记录为 0 时,我需要显示一个页脚。下面的代码似乎运行良好,当没有记录时,显示页脚。但是,有一个问题,当有记录时,虽然foote
我是一名优秀的程序员,十分优秀!