zoukankan      html  css  js  c++  java
  • IOS:重写UISlider大小解决UISlider滑动不灵敏的问题

    网上有很多写关于重写UISlider,解决滑动不灵敏的问题。

    然后又设计很多样式,吧啦吧啦一堆的。

    我感觉都没提到一个概念,有的人学习可能恰好知道了,一下子过去了不在意。有的人不了解的估计得卡半天了。

    我们理解的重写就是覆盖掉原先的值或者方法,新的生效,原来的不生效。UISlider这样理解就有问题了

    //-------------------------------------------------------------------------------------------------------

    我们直接initwithframe的时候给H,无论给多少,发现显式还是一条细线。

    _playSlider =[[Slider alloc]initWithFrame:CGRectMake(60, screenHeight-50, screenWidth-120, 30)];;

    估计有很多人重写,直接这样

    - (CGRect)trackRectForBounds:(CGRect)bounds {
        return  CGRectMake(60, screenHeight-50, screenWidth-120, 30); 
    }

    结果发现还是不行。并且会出其它问题

    正确的理解应该是,UISlider或许由多个View组成(没看过专业文档啥的,有错误指出,这里仅供理解),init时候创建的区域大小代表这个UISlider控件的大小,但它不代表其中能滑动的区域大小。

    上面假如重写中的值是以self.view为基准,这样的x,y,w,h是有问题的。

    应该把初始化initwithframe的区域大小当作父控件,重写的时候把重写的区域当作子控件,xywh以初始化时候的值区域为标准。或者说是initwithframe是UISlider的区域,你重写的才是滑动的区域大小

    所以应该是这样的

    @interface Slider ()
    @end
    @implementation Slider
    - (CGRect)trackRectForBounds:(CGRect)bounds {
        return  CGRectMake(0, 0,bounds.size.width, 30);
    }
    //下面这个我是网上找的,顺便拿了过来
    - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value{ //y轴方向改变手势范围 rect.origin.y = rect.origin.y - 10; rect.size.height = rect.size.height + 20; return CGRectInset ([super thumbRectForBounds:bounds trackRect:rect value:value], 10 ,10); } @end
    _playSlider =[[Slider alloc]initWithFrame:CGRectMake(60, screenHeight-50, screenWidth-120, 30)];;

    记住你重写是相当于以initwithframe的区域为父类,所以x,y,w,h都不要超值了。

  • 相关阅读:
    [置顶] Windows Phone后台音乐详解一
    Android应用开发学习笔记之BroadcastReceiver
    二维码闪电登录流程详解,附demo(1/2)
    C#利用Lambda和Expression实现数据的动态绑定
    从M个数中随机选出N个数的所有组合,有序,(二)
    3DShader之立方体环境映射(cubic environment mapping)
    二维码闪电登录流程详解,附demo(2/2)
    oracle 分区表exchange原理
    禁止页面复制功能 js禁止复制 禁用页面右键菜单
    sleep与信号唤醒的问题 & 内核对信号的处理方式
  • 原文地址:https://www.cnblogs.com/kc1995/p/14190445.html
Copyright © 2011-2022 走看看