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

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

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

(0)

相关推荐

  • iOS中UITableView Cell实现自定义单选功能

    今天分享下cell的单选,自定义的,不是下图这种网上找到的打对勾的,我搜了好久,基本上都是打对勾的文章,就决定自己写一篇.基本上自己的app都会有一个风格吧,咱也不能一直用打对勾的方式去做(看起来是不是很low). 我们要实现的是下面的这种形式.瞬间好看了很多,高大上了很多是吧. 具体我来给大家介绍一下.我这种方法有可能不是很好,有大神来,欢迎多多交流. 首先在你自定义的cell里面加入一个UIImageView,因为你肯定要有选择和未选择两张图片的吧,所以这个UIImageView来切换图片.

  • iOS利用MJRefresh实现自定义刷新动画效果

    本文主要介绍iOS 利用MJRefresh实现自定义动画的上拉刷新下拉加载效果,一般的类型(包括更新时间与loading图案)这里不做介绍. 要想实现此功能,首先得有一套load的图片数组. 接下来就是实现过程: 引入头文件: #import "MJRefresh.h" //自定义一个方法实现 - (void)prepareRefresh { NSMutableArray *headerImages = [NSMutableArray array]; for (int i = 1; i

  • IOS中自定义类中限制使用原生实例化方法

    IOS中自定义类中限制使用原生实例化方法 在自定义的类中,除了有系统自带的实例化方法外,还可能会有开发者自定义的实例化方法.当不想使用系统自定义方法时,而仅使用自定义的实例化方法时,可以这样做下限制. 如下示例所示: #import <UIKit/UIKit.h> @interface MYView : UIView // 限制使用系统方法进行实例化 // 方法1 - (instancetype)init UNAVAILABLE_ATTRIBUTE; // 方法2 - (instancetyp

  • iOS实现自定义日期选择器示例

    iOS自定义日期选择器,下面只是说明一下怎么用,具体实现请在最后下载代码看看: 效果如下: .h文件解析 选择日期选择器样式 typedef enum{ DateStyleShowYearMonthDayHourMinute = 0, DateStyleShowMonthDayHourMinute, DateStyleShowYearMonthDay, DateStyleShowMonthDay, DateStyleShowHourMinute }XHDateStyle; //日期选择器样式 @

  • iOS开发之自定义图片拉伸功能

    需求 为了减小app体积,同时为了适配不同尺寸屏幕或不同应用场景,很多图片素材都是标准通用的,比如IM消息气泡.按钮阴影效果等,但直接使用这些素材会产生一些问题,假如我们需要实现以下效果,即使用图片为账号密码输入框添加阴影效果: 图片素材: 直接使用图片实现的效果与需求效果对比: 经过自定义拉伸调整过后,最终效果: 实现 将storyboard中的控件关联到代码文件中,accountTextBgImageView 为textFiled 下的背景图片视图,实现代码如下: UIImage *text

  • iOS自定义日期、时间、城市选择器实例代码

    选择器,我想大家都不陌生,当需要用户去选择某些范围值内的一个固定值时,我们会采用选择器的方式.选择器可以直观的提示用户选择的值范围.统一信息的填写格式,同时也方便用户快速的进行选择,比如对于性别,正常情况下就只有男女两种情况,那这时候用一个选择器给用户进行选择的话,可以避免错误数据的输入,也更方便用户去填写.再比如需要获取用户的生日信息时,采用选择器的方式可以统一生日的格式,如果让用户自行输入的话,可能会出现各种各样的生日信息格式,不利于数据的存储,但是采用选择器的方式的话,用户可找到对应的日期

  • iOS开发-自定义相机实例(仿微信)

    网上有很多自定义相机的例子,这里只是我临时写的一个小demo,仅供参考: 用到了下面几个库: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> 在使用的时候需要在Info.plist中把相关权限写进去: Privacy - Microphone Usage Description Privacy - Photo Library Usage Description Privacy

  • iOS实现自定义起始时间选择器视图

    随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出! 最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用! 主要功能: 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器. 如果需要可以根据自己的需求来修改界面, 效果如下: 主要步骤: 创建时间选择器Picker 且确认取消按钮实现功能逻辑 创建展

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

    UIScrollView有自己默认的滚动条,可设置隐藏和显示,但是有时候这个默认的滚动条没办法满足我们的需求,那这时候只能通过自定义来实现了. 实现自定义滚动条需要解决的主要问题是: 在scrollview滚动的过程中如何改变滚动条的位置,进而确保滚动条和scrollView在相同时间内走完自己的位移,只要把这个问题解决好了,那我们就可以优雅的自定义滚动条了. 那如何解决这个滚动条的当前滚动位移呢?我们知道,UIScrollView有一个滚动范围,滚动条也有一个滚动范围,也就是说两者的最大的滚动

  • Android自定义手机界面状态栏实例代码

    前言 我们知道IOS上的应用,状态栏的颜色总能与应用标题栏颜色保持一致,用户体验很不错,那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允许开发者自定义状态栏背景颜色啦,这是个不错的体验!若你手机上安装有最新版的qq,并且你的安卓SDK版本是4.4及以上,你可以看下它的效果: 实现这个效果有两个方法: 1.在xml中设置主题或自定义style: Theme.Holo.Light.NoActionBar.TranslucentDecor Theme.Holo.NoActi

  • IOS中各种手势操作实例代码

    先看下效果 手势相关的介绍 IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种: 1.点击  UITapGestureRecognizer 2.平移  UIPanGestureRecognizer 3.缩放  UIPinchGestureRecognizer 4.旋转  UIRotationGestureRecognizer 5.轻扫  UISwipeGestureRecognizer 我们上面这个实例中就用到了上面这5种手势,不

  • iOS 增加右侧按钮功能实例代码

    一,工程图. 二,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //增加右侧按钮 [self addRightButton]; } #pragma -mark -functions //增加右侧按钮 -(void)addRightButton { UIBarButtonI

  • iOS清除所有缓存的实例代码

    本文介绍了iOS清除所有缓存的实例代码,分享给大家,具体如下: 计算缓存 NSString *libPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0]; CGFloat fileSize=[self folderSizeAtPath:libPath]; - (float ) folderSizeAtPath:(NSString*) folderPath{ NSFileMa

  • Android 自定义View之倒计时实例代码

    Android 自定义View之倒计时实例代码 需求: 大多数app在注册的时候,都有一个获取验证码的按钮,点击后,访问接口,最终用户会收到短信验证码.为了不多次写这个获取验证码的接口,下面将它自定义成一个view,方便使用. 分析一下,这是一个TextView,点击的时候变色,不能再点击,同时里面的倒计时开始显示.那么就有了下面的代码 代码: /** * 通过selector选择器来改变背景,其中倒计时运行时为android:state_enabled="true", * 不显示倒计

  • iOS 请求权限封装类的实例代码

    直接上代码 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibrary.h> #import <Photos/Photos.h> #import <CoreLocation/CoreLocation.h> @interface PermissionUtil : NSObject +(Bool

  • 利用spring的拦截器自定义缓存的实现实例代码

    本文研究的主要是利用spring的拦截器自定义缓存的实现,具体实现代码如下所示. Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.本文利用Memcached 的实例和spring的拦截器实现缓存自定义的实现.利用拦截器读取自定义的缓存标签,key值的生成策略. 自定义的Cacheable package com.jeex.sci; @Target(ElementT

  • Vue自定义toast组件的实例代码

    写了两三天,终于把toast组件写出来了.不敢说是最好的设计,希望有更好思路的朋友可以在评论区给我意见!_(:з」∠)_ 第一步:写toast.vue,将样式之类的先定下来 <template> <div v-show="showToast" class="toast" :class="position"> <div class="toast_container" v-if="type=

  • android自定义形状的按键实例代码

    步骤: 1.在drawable 文件夹中创建一个xml布局文件. 2.修改布局文件 3.在需要使用背景的按键中导入布局. 创建布局文件: 修改布局文件: <?xml version="1.0" encoding="utf-8"?> <!--shape:形状 rectangle 长方形--> <!--corners 边角--> <shape xmlns:android="http://schemas.android.

随机推荐