- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS利用UIScrollView实现无限滚动效果由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
众所周知uiscrollview 的无限滚动主要应用在图片轮播器、欢迎界面等场景。它的原理是在要显示的图片前后各加一张图片即在第一张图片之前放最后一张图片,在最后一张图片之后放第一张图片,然后在滚动到边缘的时候,巧妙的过渡一下就可以"瞒天过海","以假乱真"的造成无限滚动的假象。网络上有很多只用三张或两张图片实现的方法,效率比这个方法高,但实现起来稍微麻烦一点,有兴趣的可以去深入研究.
实现步骤 。
1、根据需求准备几张图片,在网上找了5张图片,分别命名为 img_01,img_02,img_03,img_04,img_05 .
2、代码实现,主要分为:添加uiscrollview,添加显示图片,添加uipagecontrol,然后监听uiscrollview的滚动,根据滚动的位置来设置uipagecontrol,最重要的是对于滚动到两个边缘时要特殊处理一下 。
代码如下:
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
|
#import "viewcontroller.h"
//屏幕宽度
#define screen_width [uiscreen mainscreen].bounds.size.width
//图片高度
#define img_height 180
//要显示的图片总数
#define max_size 7
#import "viewcontroller.h"
@interface viewcontroller () <uiscrollviewdelegate>
//滚动视图
@property (strong, nonatomic) uiscrollview *loopscrollview;
//指示器
@property (strong, nonatomic) uipagecontrol *pageindicator;
//要展示的图片数组
@property(strong, nonatomic) nsmutablearray *imgarray;
@end
@implementation viewcontroller
//懒加载数组
-(nsmutablearray *)imgarray
{
if
(_imgarray == nil)
{
_imgarray = [[nsmutablearray alloc]initwithcapacity:max_size];
//在要展示的5张图片的前后各加一张图片,第一张前面加第五张,第五张后面加第一张
[_imgarray addobject:[uiimage imagenamed:@
"img_05.jpg"
]];
for
(
int
i = 1; i< max_size - 1; i++) {
nsstring *imgname = [[nsstring alloc]initwithformat:@
"img_0%d.jpg"
, i];
[_imgarray addobject:[uiimage imagenamed:imgname]];
}
[_imgarray addobject:[uiimage imagenamed:@
"img_01.jpg"
]];
}
return
_imgarray;
}
- (
void
)viewdidload {
[super viewdidload];
[self setupscrollview];
[self setuppagecontrol];
}
/**
* 创建uiscrollview并设置其属性
*/
-(
void
)setupscrollview
{
uiscrollview *sc = [[uiscrollview alloc]initwithframe:cgrectmake(0, 64, screen_width, img_height)];
//创建uiimageview并添加到uiscrollview中
for
(
int
i = 0; i< max_size; i++) {
uiimageview *img = [[uiimageview alloc]initwithimage:[self.imgarray objectatindex:i]];
img.frame = cgrectmake(screen_width * i, 0, screen_width, img_height);
[sc addsubview:img];
}
//设置uiscrollview的属性
sc.contentsize = cgsizemake(screen_width * self.imgarray.count, img_height);
sc.showshorizontalscrollindicator = no;
sc.pagingenabled = yes;
//刚开始应该滚动到第二张显示,因为第一张其实是最后一张图片
[sc setcontentoffset:cgpointmake(screen_width, 0) animated:no];
//设置代理并添加到当前view中
sc.delegate = self;
[self.view addsubview:sc];
self.loopscrollview = sc;
}
/**
* 创建uipagecontrol并设置其属性
*/
-(
void
)setuppagecontrol
{
//注意frame,这样设置可以居中显示
uipagecontrol *pc = [[uipagecontrol alloc]initwithframe:cgrectmake(self.view.center.x - 50, cgrectgetmaxy(self.loopscrollview.frame) - 25 , 100, 25)];
//设置uipagecontrol的属性并添加到当前view中
pc.numberofpages = max_size - 2;
pc.currentpage = 0;
pc.pageindicatortintcolor = [uicolor redcolor];
[self.view addsubview:pc];
self.pageindicator = pc;
}
//uiscrollview的代理方法,在该方法中改变uipagecontrol并且处理边缘滚动
-(
void
)scrollviewdidenddecelerating:(uiscrollview *)scrollview
{
//获取当前uiscrollview的位置
cgpoint offset = [scrollview contentoffset];
//算出滚动到第几页
int
currentpage = offset.x/screen_width;
//设置uipagecontrol
self.pageindicator.currentpage = currentpage - 1;
//对最后一张和第一张要进行特殊处理
//1、如果是第一张
if
(currentpage == 0) {
//下面两个方法任选其一都可以达到效果,但是注意动画一定要设置为no,不然会有视觉会有辣眼睛的感觉
//方法1
[self.loopscrollview setcontentoffset:cgpointmake(screen_width * (max_size-2), 0) animated:no];
//方法2,该方法要求设置contentsize时,任一方向就算不滚动也不能为0,否则无效
//[self.loopscrollview scrollrecttovisible:cgrectmake(screen_width * (max_size-2), 0, screen_width, img_height) animated:no];
self.pageindicator.currentpage = max_size - 2;
}
//2、如果是最后一张
else
if
(currentpage == max_size - 1) {
[self.loopscrollview setcontentoffset:cgpointmake(screen_width, 0) animated:no];
//[self.loopscrollview scrollrecttovisible:cgrectmake(screen_width, 0, screen_width, img_height) animated:no];
self.pageindicator.currentpage = 0;
}
}
@end
|
实现效果 。
总结 。
好了,以上就是这篇文章的全部内容了,其实实现轮播现在最好的方案应该是使用uicollectionview,因为它是利用重用机制来实现的,性能会好很多,代码写起来类似。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流.
最后此篇关于iOS利用UIScrollView实现无限滚动效果的文章就讲到这里了,如果你想了解更多关于iOS利用UIScrollView实现无限滚动效果的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!