iOS自定义UIScrollView的滚动条实例代码

发布时间 - 2026-01-11 00:11:09    点击率:

UIScrollView有自己默认的滚动条,可设置隐藏和显示,但是有时候这个默认的滚动条没办法满足我们的需求,那这时候只能通过自定义来实现了。 实现自定义滚动条需要解决的主要问题是:

在scrollview滚动的过程中如何改变滚动条的位置,进而确保滚动条和scrollView在相同时间内走完自己的位移,只要把这个问题解决好了,那我们就可以优雅的自定义滚动条了。

那如何解决这个滚动条的当前滚动位移呢?我们知道,UIScrollView有一个滚动范围,滚动条也有一个滚动范围,也就是说两者的最大的滚动位移是固定的,那要想两者在相同时间内走完自己的位移,只需要确保两者的当前滚动位移和总位移之比一致就行。也就是说:

scrollView的当前位移/scrollView的总位移=滚动条的当前位移/滚动条的总位移

得到这个关系后,想要知道滚动条的当前位移,就不是什么难事了。我们可以通过UIScrollView的代理方法获取scrollview的当前滚动位移,scrollview的总位移和滚动条的总位移是固定的,那显然我们可以方便的得出滚动条的当前位移,这样,得到了滚动条的当前位移,我们就可以通过改变滚动条的frame,进而实现让滚动条跟随scrollview滚动。

但是这里需要注意一点,因为这个位移是相对位移,所以在修改滚动条的frame时,要记得加上滚动条距离相对的参考系的左边距离,这样才是其真正的位移。比如现在滚动条的x是从屏幕左边15开始的,滚动条的滚动范围是屏幕宽度减去30,那么当你以屏幕宽度减去30这个数值作为滚动条的滚动总位移,进而算出滚动条的当前位移时,需要加上距离左边的15才是滚动条真正的位移。

接下来看一下代码的具体实现吧:

一、创建scrollview:(记得签代理UIScrollViewDelegate)

-(UIScrollView *)scrollView{
  if (!_scrollView) {
    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 164, self.view.frame.size.width, 233)];
    _scrollView.delegate = self;
    _scrollView.scrollEnabled = YES;
    _scrollView.bounces = NO;
    _scrollView.showsHorizontalScrollIndicator=NO;
    _scrollView.layer.shadowColor = [UIColor redColor].CGColor;//shadowColor阴影颜色
    _scrollView.layer.shadowOffset = CGSizeMake(0,0);//shadowOffset阴影偏移,x向右偏移,y向下偏移
    _scrollView.layer.shadowOpacity = 0.5;//阴影透明度,默认0
    _scrollView.layer.shadowRadius = 3;//阴影半径,默认3

  }
  return _scrollView;
}

二、创建自定义的滚动条以及在scrollview上加点内容:

-(void)loadView{
  [super loadView];
  [self.view addSubview:self.scrollView];

  slideBackView=[[UIView alloc] initWithFrame:CGRectMake(15, _scrollView.frame.origin.y+_scrollView.frame.size.height+20, self.view.frame.size.width-30, 8)];
  [self.view addSubview:slideBackView];
  slideBackView.backgroundColor = [UIColor colorWithRed:0.91 green:0.91 blue:0.91 alpha:1.00];
  slideBackView.layer.cornerRadius = 4;


  sliderView = [[UIView alloc] init];
  [self.view addSubview:sliderView];
  sliderView.frame=CGRectMake(slideBackView.frame.origin.x, slideBackView.frame.origin.y+(slideBackView.frame.size.height-7 )/2, 40 , 7 );
  sliderView.backgroundColor =[UIColor colorWithRed:0.12 green:0.72 blue:0.88 alpha:1.00];
  sliderView.layer.cornerRadius = 3.5;

 NSArray *textDesArr=@[@"• 产品战略规划:市场目标、用户目标、关键成功要素分析、管理和运用自己的资源来达成目标\n• 产品战略实施:有损原则、平衡原则、聚焦原则\n• 产品需求文档:实例讲解,牛逼的需求文档是怎么诞生的\n• 主动:战略思考、资源争取\n• 推动:项目立项、迭代跟踪\n• 沟通:上传下达、思想一统\n• 平衡:各方协调、跨部沟通\n• 把控:管理得法、取舍有道",
          @"• 用户思维:具体案例解析\n• 运营思维:具体案例解析\n• 数据思维:具体案例解析\n• 产品经理的用研能力模型\n• 用户研究基本概念解析\n• 用研基础搭建及建设\n• 用研人员分工及工作职责细分"
          @"• 常用用户研究方法详解\n• 桌面研究、定性研究、定量研究三种方法举例讲解及详细步骤解析\n• 卡诺模型\n• 战略级的市场及用户研究\n• 以科学的方法在产品整个生命周期中进行“研究”",
          @"• 品生命周期用户研究侧重点以及研究方法解读\n• 产品用研规划建立\n• 在产品不同生命周期,侧重不同用研方法,更准确进行产品迭代",
          @"• 格局:大格局思维,聚焦做实事\n• 决策:让琐碎的运营变有趣,“舍得”之道\n• owner精神:有狼性\n• 敏锐:“细节”出真知\n• 商业素养",
          @"• 高情商:做个让人感觉“舒适”的资深运营\n• 凝聚力:1+1>2,善用团队用人所长,没有完美的个人,只有优秀的团队\n• 影响力:在互联网领域成为运营专家,沉淀经验,让成功有迹可循\n• 知识传承力:资深运营的价值,不是个人优秀,而是让人人优秀。",
          @"• 数据运营体系的构成\n• 数据规范与平台\n• 数据运营体系结构\n• 数据数据平台构建\n• 核心数据指标\n• 移动端产品数据埋点范例\n• 数据需求指标\n• 产品关键数据\n• 数据运营体系的构成",
            ];

  NSInteger contentCount=textDesArr.count;
  for (NSInteger i = 0; i <contentCount; i++) {

      UILabel *textDesLabel=[[UILabel alloc] initWithFrame:CGRectMake(10+190 *i,0, 180 , 233 )];
      [_scrollView addSubview:textDesLabel];
      textDesLabel.textColor=[UIColor colorWithRed:0.49 green:0.49 blue:0.49 alpha:1.00];
      textDesLabel.font = [UIFont systemFontOfSize:12 ];
      textDesLabel.text = textDesArr[i];
      textDesLabel.numberOfLines = 0;
      textDesLabel.layer.borderWidth = 0.5;
      textDesLabel.layer.borderColor = [UIColor colorWithRed:0.91 green:0.91 blue:0.91 alpha:1.00].CGColor;
      textDesLabel.backgroundColor = [UIColor whiteColor];


  }

  //scrollView的滚动范围
  _scrollView.contentSize = CGSizeMake(190*contentCount+10, 0);



}

三、在UIScrollView的代理滚动方法中修改滚动条的当前位移:

这里是以自定义横向滚动条为例,竖向滚动条也是一样的原理。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
  [UIView animateWithDuration:0.5 animations:^{

    CGPoint offset = scrollView.contentOffset;

    // scrollView的当前位移/scrollView的总位移=滑块的当前位移/滑块的总位移
    //    offset/(scrollView.contentSize.width-scrollView.frame.size.width)=滑块的位移/(slideBackView.frame.size.width-sliderView.frame.size.width)
    //    滑块距离屏幕左边的距离加上滑块的当前位移,即为滑块当前的x

    CGRect frame=sliderView.frame;

    frame.origin.x=15 + offset.x*(slideBackView.frame.size.width-sliderView.frame.size.width)/(scrollView.contentSize.width-scrollView.frame.size.width);

    sliderView.frame = frame;



  }];
}

这样,自定义的滚动条就实现了。效果如图

另外,在这里提一下阴影的使用方法,有时候我们需要加一些阴影效果,怎么加呢?

主要用到layershadowColor(阴影颜色) 、shadowOffset ()阴影大小、hadowOpacity (阴影透明度)、shadowRadius(阴影圆角)这几个属性

如:

    _scrollView.layer.shadowColor = [UIColor redColor].CGColor;//shadowColor阴影颜色
    _scrollView.layer.shadowOffset = CGSizeMake(0,0);//shadowOffset阴影偏移,x向右偏移,y向下偏移
    _scrollView.layer.shadowOpacity = 0.5;//阴影透明度,默认0
    _scrollView.layer.shadowRadius = 3;//阴影半径,默认3

下载地址:CustomScrollViewSliderView_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# uiscrollview  # 滚动条  # ios  # 自定义滚动条  # 自定义滚动条样式  # iOS应用开发中UIScrollView滚动视图的基本用法总结  # iOS开发中使用UIScrollView实现图片轮播和点击加载  # iOS中UIScrollView嵌套UITableView的实践教程  # iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码  # iOS开发中使用UIScrollView实现无限循环的图片浏览器  # iOS应用开发中使用UIScrollView控件来实现图片缩放  # iOS开发上下滑动UIScrollview隐藏或者显示导航栏的实例  # iOS利用UIScrollView实现无限滚动效果  # iOS基于UIScrollView实现滑动引导页  # iOS bounds学习笔记以及仿写UIScrollView部分功能详解  # 自定义  # 自己的  # 滑块  # 才是  # 我们可以  # 时间内  # 卡诺  # 就可以  # 走完  # 上传下达  # 也就是说  # 实现了  # 迭代  # 文档  # 互联网  # 让人  # 在这里  # 也有  # 好了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS服务器上快速部署高效网站?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  电商网站制作价格怎么算,网上拍卖流程以及规则?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何实现建站之星域名转发设置?  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel API资源类怎么用_Laravel API Resource数据转换  黑客入侵网站服务器的常见手法有哪些?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel如何记录自定义日志?(Log频道配置)  如何自定义建站之星网站的导航菜单样式?  网站页面设计需要考虑到这些问题  Laravel怎么连接多个数据库_Laravel多数据库连接配置  高防服务器租用首荐平台,企业级优惠套餐快速部署  手机网站制作与建设方案,手机网站如何建设?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何正确选择百度移动适配建站域名?  Linux网络带宽限制_tc配置实践解析【教程】  Laravel集合Collection怎么用_Laravel集合常用函数详解  三星网站视频制作教程下载,三星w23网页如何全屏?  如何在宝塔面板中修改默认建站目录?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何在企业微信快速生成手机电脑官网?  javascript基本数据类型及类型检测常用方法小结  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  JavaScript Ajax实现异步通信  如何快速选择适合个人网站的云服务器配置?  iOS正则表达式验证手机号、邮箱、身份证号等  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  JavaScript实现Fly Bird小游戏  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何用美橙互联一键搭建多站合一网站?  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何获取PHP WAP自助建站系统源码?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  用v-html解决Vue.js渲染中html标签不被解析的问题  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  SQL查询语句优化的实用方法总结  如何快速搭建虚拟主机网站?新手必看指南  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  高防服务器:AI智能防御DDoS攻击与数据安全保障