【发布时间】:2012-08-14 13:57:12
【问题描述】:
为了“抓住”一个 ui 滑块的手柄,必须触碰它的顶部。我对修改行为感兴趣,以便用户只需要在 uislider 中的任何位置着陆。触地时,手柄会跳到用户触摸的任何位置。我该怎么做?
【问题讨论】:
标签: objective-c cocoa uikit
为了“抓住”一个 ui 滑块的手柄,必须触碰它的顶部。我对修改行为感兴趣,以便用户只需要在 uislider 中的任何位置着陆。触地时,手柄会跳到用户触摸的任何位置。我该怎么做?
【问题讨论】:
标签: objective-c cocoa uikit
我通过在 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];
}
【讨论】:
我知道这是一个老问题,但我只想提一下,我最近想出了一种不同的方法来做到这一点。简而言之:
- (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 什么时候会引入整数/定位滑块等。
【讨论】:
在我的脑海中,我想说你应该注意视图上的触摸。当检测到触摸时,检查它与UISlider 主体的距离。如果在一定范围内,做(伪)
sliderValue = sliderMinValue + (sliderMaxValue-sliderMinValue)/(xCoordOfTouch - sliderLeftSideXCoord)/sliderLength
所以基本上你是在计算滑块应该具有的值,基于用户相对于滑块框架的触摸位置。
你提到这个很有趣,因为我今天也在考虑做同样的事情。如果我启动并运行某些东西,我会发布它(但不要屏住呼吸)。
【讨论】:
如果您有最小值或最大值图像,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];
}
}
【讨论】: