2012-08-14 133 views
0

爲了「抓住」UI滑塊的手柄,必須觸摸它的頂部。我有興趣修改行爲,以便用戶只需觸摸uislider中的任何位置即可。觸摸時,手柄會跳轉到用戶觸摸的任何位置。我怎樣才能做到這一點?UISlider - 選擇何時觸摸拇指

回答

1

我通過重寫touchesBegan來完成它:withEvent:在UISlider的子類中。您不必檢查觸摸與滑塊的距離有多近,因爲如果滑塊位於滑塊上方,您只會觸摸一個事件。此代碼適用於使用默認的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]; 
} 
+0

夠簡單。謝謝! – morgancodes 2012-08-15 16:27:53

0

關閉我的頭頂我會說你應該留意接觸視圖。當檢測到觸摸時,請檢查它與UISlider機身的接近程度。如果它是在一定範圍內,做的(僞)

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

所以基本上你滑塊應根據用戶觸碰相對於滑塊的幀中計算值。

你提到這很有趣,因爲我在想今天做同樣的事情。如果我找到了一些東西,我會發布它(但不要屏住呼吸)。

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]; 
    } 
} 
1

我知道這是一個老問題,但我只是想提一提,我想出了一個不同的方式最近做到這一點。簡而言之:

- (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; 
} 

我認爲這是解決問題的一個更安全的方式,因爲你不必手動生成滑塊的值。你永遠不知道蘋果什麼時候可能會引入整數/制動滑塊等。