欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS应用开发中UIScrollView滚动视图的基本用法总结

程序员文章站 2023-01-01 18:32:24
在项目开发时遇到一个问题,我在uiviewcontroller上面直接创建了一个uiscrollerview,把uiscrollerview作为一个子视图添加到了uivie...

在项目开发时遇到一个问题,我在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");
}