【问题标题】:UISlider thumb moving without touching thumbUISlider 拇指移动而不接触拇指
【发布时间】:2026-01-10 02:20:09
【问题描述】:

我在我的项目中使用UISlider。通常,只要我们触摸并拖动拇指,拇指就会移动。但是,在我的情况下,当我触摸它的边缘而不触摸它时,拇指移动了。像这样:

这是我的代码:

self.slider = [[UISlider alloc] initWithFrame:CGRectMake(30, [UIScreen mainScreen].bounds.size.height - 200, [UIScreen mainScreen].bounds.size.width-30, 30)];
[self.view addSubview:self.slider];

为什么拇指移动了,如何处理?我的目标是,拇指只有在我触摸并拖动它时才会移动,并且当我触摸它的边缘时不会移动。

【问题讨论】:

    标签: ios objective-c uislider


    【解决方案1】:

    尝试添加以下代码:

      - (void)viewDidLoad
     {
    
         UITapGestureRecognizer *tapGest = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)];
         [slider addGestureRecognizer:tapGest];
    
     }
    
     - (void)sliderTapped:(UIGestureRecognizer *)tapGest 
     {
            UISlider* slider = (UISlider*)tapGest.view;
            if (slider.highlighted)
                return; // tap on thumb, let slider deal with it
            CGPoint pt = [tapGest locationInView: slider];
            CGFloat percentage = pt.x / slider.bounds.size.width;
            CGFloat delta = percentage * (slider.maximumValue - slider.minimumValue);
            CGFloat value = slider.minimumValue + delta;
            [slider setValue:value animated:YES];
    
      }
    

    【讨论】:

      【解决方案2】:

      为此,您需要将 taoGesture 与UISlider 一起使用,因此首先在您的滑块对象中添加UITapGestureRecognizer,然后在gestureRecognizer 的选择器的操作方法中设置其值。

      在视图中添加滑块后添加以下代码。

      UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onSliderTap:)];
      [self.slider addGestureRecognizer:tapGestureRecognizer];
      

      现在在onSliderTap你可以获取位置点然后更新滑块的值

      - (void)onSliderTap:(UITapGestureRecognizer *)recognizer {
          float width = self.slider.frame.size.width;
          CGPoint point = [recognizer locationInView:recognizer.view];
          CGFloat sliderX = self.slider.frame.origin.x;
          float newValue = ((point.x - sliderX) * self.slider.maximumValue) / width;
          [self.slider setValue:newValue];
      }
      

      【讨论】: