0

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

4

4 回答 4

2

我通过在 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];
}
于 2012-08-15T07:19:03.823 回答
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;
}

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

于 2013-08-18T14:17:54.557 回答
0

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

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

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

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

于 2012-08-14T16:37:16.947 回答
0

如果您有最小值或最大值图像,则 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];
    }
}
于 2013-02-10T19:47:31.577 回答