zoukankan      html  css  js  c++  java
  • iOS UISlider滑动块触摸范围调整变大

    正常情况下,我们自定义的滑动区域都不会太大,否则UI不美观,但是这样,又会手势不灵敏,用户体验变差。

    如何解决?

    这里有一种方案:封装一个继承UISlider的自定义类,重写thumbRectForBounds方法,原理就是对thumb区域rect进行放大处理。

    代码如下:

    1、新建一个类,继承UISlider

    h文件:

    #import <UIKit/UIKit.h>
    
    
    
    @interface DBSlider : UISlider
    
    @end

    m文件:

    #import "DBSlider.h"
    
    #define thumbBound_x 10
    #define thumbBound_y 20
    
    @interface DBSlider ()
    {
        CGRect lastBounds;
    }
    
    @end
    
    @implementation DBSlider
    
    
    - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
    {
    
        rect.origin.x = rect.origin.x;
        rect.size.width = rect.size.width ;
        CGRect result = [super thumbRectForBounds:bounds trackRect:rect value:value];
        
        lastBounds = result;
        return result;
    }
    
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
        
        UIView *result = [super hitTest:point withEvent:event];

          if (point.x < 0 || point.x > self.bounds.size.width){

            return result;

          }

    if ((point.y >= -thumbBound_y) && (point.y < lastBounds.size.height + thumbBound_y)) {
            float value = 0.0;
            value = point.x - self.bounds.origin.x;
            value = value/self.bounds.size.width;
            
            value = value < 0? 0 : value;
            value = value > 1? 1: value;
            
            value = value * (self.maximumValue - self.minimumValue) + self.minimumValue;
            [self setValue:value animated:YES];
        }
        return result;
        
    }
    
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
        BOOL result = [super pointInside:point withEvent:event];
        if (!result && point.y > -10) {
            if ((point.x >= lastBounds.origin.x - thumbBound_x) && (point.x <= (lastBounds.origin.x + lastBounds.size.width + thumbBound_x)) && (point.y < (lastBounds.size.height + thumbBound_y))) {
                result = YES;
            }
          
        }
          return result;
    }
    
    @end

    代码直接拷贝即可。

    如果你已经用UISlider画好了控件:

    1、如果是代码创建,直接更改类名-UISlider  ->  DBSlider

    2、如果是xib,修改控件的Custom Class, 再重新连线就可以了,其他都不用改。

  • 相关阅读:
    设置和查看时间
    通过linux ssh远程登录另一台Linux,无需密码,用证书验证
    openssl生成自签名证书
    技术集锦
    centos系统安装中文字体几种方法
    集群中几种session同步解决方案的比较
    leetcode 88. C++ 合并两个有序数组
    CycleGAN --- Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
    剑指offer---二叉树的深度
    C++基础(2)
  • 原文地址:https://www.cnblogs.com/yajunLi/p/6722244.html
Copyright © 2011-2022 走看看