2012-01-09 34 views
41

在我的應用程序中,我有幾個UISlider實例來更改各種值。這些值顯示在滑塊旁邊,並在應用程序的另一個可見部分中顯示在三維空間中。檢查用戶是否在連續的UISlider上滑動?

3d部分包含一些相當繁重的計算,現在似乎不可能在滑塊更改時更新它。這意味着我必須將滑塊的continuous屬性設置爲NO,因此只有在滑塊完成更改時纔會更新。

但是,我希望顯示值更新。有沒有辦法讓滑塊連續(所以我可以實時更新我的​​價值標籤),並且在用戶完成與它的交互後仍然發送某種消息?我現在的直覺是將UISlider劃分子類並覆蓋touchesEnded:方法。這是可行的嗎?

回答

72

你可以用簡單的目標/動作來做到這一點。

UIControlEventValueChanged事件設置目標和操作,然後爲UIControlEventTouchUpInside事件設置另一個目標和操作。將continuous屬性設置爲YES時,值更改事件將在滑塊更改值時觸發,而只有當用戶釋放控件時觸發內部事件纔會觸發。

+0

感謝。這正是我期待的。突然間, – winsmith 2012-01-09 20:52:57

+1

不再適用於iOS7。 6仍然有效。 – dklt 2013-09-27 08:10:11

+1

@dklt你有沒有考慮過在http://bugreport.apple.com上提出bug報告 – Jasarien 2013-09-27 09:12:50

15

另請注意,您應該連接UIControlEventTouchUpOutside事件,以防用戶在擡起手指之前將手指拖出控件。

16

我只需要這樣做,所以我查了一下touch屬性,並使用了完整的IBAction頭。

對於想要一些額外控制的人來說,這應該是一個可行的選擇,儘管Jas在代碼方面肯定更容易。

- (IBAction)itemSlider:(UISlider *)itemSlider withEvent:(UIEvent*)e; 
{ 
    UITouch * touch = [e.allTouches anyObject]; 

    if(touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan) 
    { 
     //The user hasn't ended using the slider yet. 
    } 

} 

:d

+0

在兩種情況下均可正常工作。我無法相信我不知道還有一個事件參數被髮送。 – 2013-10-14 11:54:42

+0

@ alex-i當我應該調用此方法? – user2545330 2013-11-19 14:35:20

+3

@ user2545330'[slider addTarget:@selector(itemSlider:withEvent :) forControlEvents:UIControlEventValueChanged];' - 當滑塊值發生變化時,這將調用上面的方法。更多信息:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html#//apple_ref/occ/instm/UIControl/addTarget:action:forControlEvents: – 2013-11-19 14:57:33

4

在夫特3:

@IBAction func sliderValueChanged(_ slider: UISlider, _ event: UIEvent) { 
    guard let touch = event.allTouches?.first, touch.phase != .ended else { 
     // ended 
     return 
    } 
    // not ended yet 
}