【问题标题】:How to change a UISlider value using a single touch?如何使用单次触摸更改 UISlider 值?
【发布时间】:2012-12-30 15:51:41
【问题描述】:

我正在开发我的第一个 iOS 应用程序,其中包含 UISlider。我知道在拖动UISlider 时如何获取值。但是对于我的应用程序,我需要一键获取滑块的值;即,如果我触摸UISlider 中的某个位置,UILabel 应该会显示其正确值。

这样可以吗。任何教程或代码都会非常有帮助。

【问题讨论】:

    标签: iphone ios objective-c uislider


    【解决方案1】:

    这里 tapCount 是在 .h 文件中声明的int 变量

    - (void)viewDidLoad
    {
      tapCount = 0; // Count tap on Slider 
    
     UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)];
        [slider addGestureRecognizer:gr];
        
    }
    
     - (void)sliderTapped:(UIGestureRecognizer *)g 
        {
    /////////////// For TapCount////////////
    
            tapCount = tapCount + 1;
            NSLog(@"Tap Count -- %d",tapCount);
    
    /////////////// For TapCount////////////
    
            UISlider* s = (UISlider*)g.view;
            if (s.highlighted)
                return; // tap on thumb, let slider deal with it
            CGPoint pt = [g locationInView: s];
            CGFloat percentage = pt.x / s.bounds.size.width;
            CGFloat delta = percentage * (s.maximumValue - s.minimumValue);
            CGFloat value = s.minimumValue + delta;
            [s setValue:value animated:YES];
            
            NSString *str=[NSString stringWithFormat:@"%.f",[self.slider value]];
            self.lbl.text=str;
        }
    

    对于 Swift 用户

    override func viewDidLoad()
    {
        super.viewDidLoad()
    
        tapCount = 0
        let gr = UITapGestureRecognizer(target: self, action: #selector(self.sliderTapped(_:)))
        slider.addGestureRecognizer(gr)
    
    }
    
    func sliderTapped(_ g: UIGestureRecognizer) {
        
        /////////////// For TapCount////////////
        tapCount = tapCount + 1
        print("Tap Count -- \(tapCount)")
        /////////////// For TapCount////////////
        
        let s: UISlider? = (g.view as? UISlider)
        if (s?.isHighlighted)! {
            return
        }
        
        // tap on thumb, let slider deal with it
        let pt: CGPoint = g.location(in: s)
        let percentage = pt.x / (s?.bounds.size.width)!
        let delta = Float(percentage) * Float((s?.maximumValue)! - (s?.minimumValue)!)
        let value = (s?.minimumValue)! + delta
        s?.setValue(Float(value), animated: true)
        let str = String(format: "%.f", slider.value)
        lbl.text = str
    }
    

    【讨论】:

      【解决方案2】:

      更正@ipatel:以前的答案中的数学不完整,并且由于缺少拇指宽度考虑因素而导致抖动

      如果您选择子类化UISlider,它应该是这样的:

      - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
      {
          [super beginTrackingWithTouch:touch withEvent:event];
          CGPoint touchLocation = [touch locationInView:self];
          CGFloat value = self.minimumValue + (self.maximumValue - self.minimumValue) *
              ((touchLocation.x - self.currentThumbImage.size.width/2) /
              (self.frame.size.width-self.currentThumbImage.size.width));
          [self setValue:value animated:YES];
      
          return YES;
      }
      

      【讨论】:

      • 从长远来看,我发现覆盖UISlider 很脆弱,需要不断维护以跟上iOS 的升级。我更好的解决方案发布在github.com/arquebuse/TGPControls。它不会覆盖UISlider,因此被证明更加健壮。它还使用CALayer 制作动画,动画流畅且完全可定制。
      【解决方案3】:

      接受答案的 Swift 版本,

      @IBAction func sliderTappedAction(sender: UITapGestureRecognizer)
      {
          if let slider = sender.view as? UISlider {
      
              if slider.highlighted { return }
      
              let point = sender.locationInView(slider)
              let percentage = Float(point.x / CGRectGetWidth(slider.bounds))
              let delta = percentage * (slider.maximumValue - slider.minimumValue)
              let value = slider.minimumValue + delta
              slider.setValue(value, animated: true)
          }
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用下面的操作方法显示UISlider 的当前值。

        - (IBAction) sliderValueChanged:(UISlider *)sender {  
            yourLable.text = [NSString stringWithFormat:@"%.1f", [sender value]];  
        } 
        

        请参阅UISlider 的这些教程和示例:

        1. UISlider-tutorial-example-how-to-use-slider-in-iphone-sdk-xcode
        2. iphone-slider-control-uislider-control-tutorial

        第二个教程示例显示UISliderUILable 中的当前(最新)值,请参见下图。

        【讨论】:

        • 感谢您的帮助,帕拉斯。但我不是在寻找这个。我从这里的另一个问题中寻找答案。这就是我要找的stackoverflow.com/questions/2895122/…
        • 那你到底想要什么??
        • @Ravisankarvm 哦,好吧,现在我明白了,使用点击或点击屏幕只是给出更改滑块值的值...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多