【问题标题】:UISlider - select when touch down off of thumbUISlider - 当拇指触地时选择
【发布时间】:2012-08-14 13:57:12
【问题描述】:

为了“抓住”一个 ui 滑块的手柄,必须触碰它的顶部。我对修改行为感兴趣,以便用户只需要在 uislider 中的任何位置着陆。触地时,手柄会跳到用户触摸的任何位置。我该怎么做?

【问题讨论】:

    标签: objective-c cocoa uikit


    【解决方案1】:

    我通过在 UISlider 的子类中覆盖 touchesBegan:withEvent: 来做到这一点。您不必检查触摸与滑块的距离有多近,因为只有在滑块上方时您才会收到触摸事件。此代码适用于设置为默认 0 到 1 比例的滑块。

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        float xPoint = [[[event allTouches]anyObject]locationInView:self].x;
        [self setValue:xPoint/self.frame.size.width];
        [super touchesBegan:touches withEvent:event];
    }
    

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我只想提一下,我最近想出了一种不同的方法来做到这一点。简而言之:

      - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
          BOOL ignored = [super beginTrackingWithTouch:touch withEvent:event];
          return YES;
      }
      
      - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
          BOOL ignored = [super continueTrackingWithTouch:touch withEvent:event];
          return YES;
      }
      

      我认为这是解决问题的一种更安全的方法,因为您不必手动生成滑块的值。你永远不知道 Apple 什么时候会引入整数/定位滑块等。

      【讨论】:

        【解决方案3】:

        在我的脑海中,我想说你应该注意视图上的触摸。当检测到触摸时,检查它与UISlider 主体的距离。如果在一定范围内,做(伪)

        sliderValue = sliderMinValue + (sliderMaxValue-sliderMinValue)/(xCoordOfTouch - sliderLeftSideXCoord)/sliderLength
        

        所以基本上你是在计算滑块应该具有的值,基于用户相对于滑块框架的触摸位置。

        你提到这个很有趣,因为我今天也在考虑做同样的事情。如果我启动并运行某些东西,我会发布它(但不要屏住呼吸)。

        【讨论】:

          【解决方案4】:

          如果您有最小值或最大值图像,rdelmar 的答案将不起作用。我修改了 rdelmar 的 touchesBegan:withEvent: 方法,只看到轨道上的触摸,而不是边缘的触摸。

          希望对你有帮助

          -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
              float xPoint = [[touches anyObject] locationInView:self].x;
              float trackWidth = [self trackRectForBounds:self.bounds].size.width;
              float margin = (self.bounds.size.width - trackWidth) / 2;
              float xOffset = xPoint - margin;
          
              if (xOffset >= 0.0 && xOffset <= trackWidth) {
                  float newValue = xOffset / trackWidth;
                  [self setValue:newValue animated:YES];
                  [super touchesBegan:touches withEvent:event];
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多