iOS应用开发中UIScrollView滚动视图的基本用法总结
在项目开发时遇到一个问题,我在uiviewcontroller上面直接创建了一个uiscrollerview,把uiscrollerview作为一个子视图添加到了uiviewcontroller,
又再uiscrollerview中添加了一个uislider的组件,在手势滑动的过程中,很难滑动到uislider这个控件,经常是滑动的时候uiscrollerview进行了滚动,
而uislider这个控件没有滑动,让人很抓狂。
上网具体去了解了一下uiscrollerview的详解,终于彻底明白了问题出在哪里
下面引用一下前辈的总结,因为自己觉得没有他总结的详细
uiscrollview重载了hittest方法,当手指touch的时候,uiscrollview会拦截所有event,然后等待150ms,在这段时间内,如果没有手指没有移动,当时间结束时,uiscrollview会发送tracking event到子视图上,并且自身不滑动。在时间结束前,手指发生了移动,那么uiscrollview就会进行滑动,从而取消发送tracking。
看来是uiscrollview的问题。直接拖动uislider,此时touch时间在150ms以内,uiscrollview会认为是拖动自己,从而拦截了event,导致uislider接受不到滑动的event。但是只要按住uislider一会再拖动,此时此时touch时间超过150ms,因此滑动的event会发送到uislider上。
期间试过几种方法,只有一种可行,就是重写uiscrollview的hittest方法:当滑动uislider时,使uiscrollview不可滑动。
但是又出现了一个问题,我的uiscrollerview是直接继承了uiscrollerview,在uiviewcontroller中是无法重写的uiscrollerview的hittest方法的,所以需要重新创建一个view,继承uiscrollerview,然后再重写上述方法,然后再导入uiviewcontroller中就可以轻松实现了。
下面来看一些uiscrollerview中一些比较常见的用法,说明都包含在注释中了:
- (void)viewdidload
{
[super viewdidload];
scrollview = [[uiscrollview alloc] initwithframe:cgrectmake(0, 0, 320, 460)];
scrollview.backgroundcolor = [uicolor redcolor];
// 是否支持滑动最顶端
// scrollview.scrollstotop = no;
scrollview.delegate = self;
// 设置内容大小
scrollview.contentsize = cgsizemake(320, 460*10);
// 是否反弹
// scrollview.bounces = no;
// 是否分页
// scrollview.pagingenabled = yes;
// 是否滚动
// scrollview.scrollenabled = no;
// scrollview.showshorizontalscrollindicator = no;
// 设置indicator风格
// scrollview.indicatorstyle = uiscrollviewindicatorstylewhite;
// 设置内容的边缘和indicators边缘
// scrollview.contentinset = uiedgeinsetsmake(0, 50, 50, 0);
// scrollview.scrollindicatorinsets = uiedgeinsetsmake(0, 50, 0, 0);
// 提示用户,indicators flash
[scrollview flashscrollindicators];
// 是否同时运动,lock
scrollview.directionallockenabled = yes;
[self.view addsubview:scrollview];
uilabel *label = [[uilabel alloc] initwithframe:cgrectmake(0, 200, 320, 40)];
label.backgroundcolor = [uicolor yellowcolor];
label.text = @"学习scrolleview";
[scrollview addsubview:label];
[label release];
}
#pragma mark -
/*
// 返回一个放大或者缩小的视图
- (uiview *)viewforzoominginscrollview:(uiscrollview *)scrollview
{
}
// 开始放大或者缩小
- (void)scrollviewwillbeginzooming:(uiscrollview *)scrollview withview:
(uiview *)view
{
}
// 缩放结束时
- (void)scrollviewdidendzooming:(uiscrollview *)scrollview withview:(uiview *)view atscale:(float)scale
{
}
// 视图已经放大或缩小
- (void)scrollviewdidzoom:(uiscrollview *)scrollview
{
nslog(@"scrollviewdidscrolltotop");
}
*/
// 是否支持滑动至顶部
- (bool)scrollviewshouldscrolltotop:(uiscrollview *)scrollview
{
return yes;
}
// 滑动到顶部时调用该方法
- (void)scrollviewdidscrolltotop:(uiscrollview *)scrollview
{
nslog(@"scrollviewdidscrolltotop");
}
// scrollview 已经滑动
- (void)scrollviewdidscroll:(uiscrollview *)scrollview
{
nslog(@"scrollviewdidscroll");
}
// scrollview 开始拖动
- (void)scrollviewwillbegindragging:(uiscrollview *)scrollview
{
nslog(@"scrollviewwillbegindragging");
}
// scrollview 结束拖动
- (void)scrollviewdidenddragging:(uiscrollview *)scrollview willdecelerate:(bool)decelerate
{
nslog(@"scrollviewdidenddragging");
}
// scrollview 开始减速(以下两个方法注意与以上两个方法加以区别)
- (void)scrollviewwillbegindecelerating:(uiscrollview *)scrollview
{
nslog(@"scrollviewwillbegindecelerating");
}
// scrollview 减速停止
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview
{
nslog(@"scrollviewdidenddecelerating");
}