Funciona perfeitamente! Onde você conseguiu a fonte para isso?
Roi Mulia
2
obrigado @RoiMulia, não me lembro de onde o vi pela primeira vez, uso sliders há anos. Às vezes, eu o uso para ignorar a alteração em UITouchPhaseEnded, pois o valor tende a pular quando o usuário levanta o dedo.
Devin Pitcher
2
Lembre-se de definir isContinuous = trueem seu UISlider.
krlbsk de
2
Esta é uma ótima solução, mas tem um problema com o cancelamento por toque. Apesar de haver um evento "cancelado" no enum touchEvent, ele não é disparado quando o toque é cancelado. Portanto, eu recomendo também adicionar um ouvinte para o evento touchCancel do Slider. Isso deve abranger todas as possibilidades.
bnussey
2
Vi que às vezes a fase pode ir: começou, estacionou, mudou, mas depois nunca terminou nem cancelou. Isso é problemático para meu caso de uso, pois eu esperava que cada interação terminasse ou fosse cancelada. A correção é observada acima: use um alvo / ação de cancelamento de toque separado.
Jordan H
71
Eu uso as notificações "Retoque interno" e "Retoque externo".
Interface Builder:
Conecte ambas as notificações no Interface Builder ao seu método de recebimento. O método pode ser assim:
-(IBAction)lengthSliderDidEndSliding:(id)sender {NSLog(@"Slider did end sliding... Do your stuff here");}
Em código:
Se você quiser conectá-lo programaticamente, terá algo assim em seu viewWillAppear (ou onde quer que seja adequado), chame:
Isso enviará uma dragEndedForSlider:mensagem a você quando o toque terminar.
Se quiser fazer isso na ponta, você pode clicar com o botão direito do mouse no controle deslizante para obter o menu de conexões e, em seguida, arrastar do soquete “Retocar dentro” para o objeto de destino.
Você também deve adicionar um alvo e uma ação para UIControlEventTouchUpOutsidee para UIControlEventTouchCancel.
@rob mayoff Desculpe, mas você precisa usar UIControlEventTouchUpOutside. Caso contrário, o seletor não será chamado se seu dedo não estiver no controle deslizante quando você terminar de arrastar.
user3164248
2
O comportamento de UISlidermudou desde que escrevi esta resposta.
rob mayoff
Pode confirmar que você também precisa registrar um manipulador para UIControlEventTouchUpOutside no iOS 9.
lms
Eu nunca fui capaz de invocar o UIControlEventTouchCancelhandler no iOS 9. Mas sou capaz de invocar UIControlEventTouchUpInsidee UIControlEventTouchUpOutsideapenas.
petrsyn
17
Swift 5 e Swift 4
Adicione alvo para eventos touchUpInsidee touchUpOutside. Você pode fazer isso programaticamente ou a partir do storyboard. É assim que você faz isso programaticamente
Eu tive o mesmo problema e eventualmente fiz isso funcionar, então talvez ajude alguém. Conecte your_Slider a 'Value Changed' no storyboard e quando o slider for movido, "Slider Touched" acionado e quando for solto "Slider Released".
Às vezes, você desejará que os eventos de arrastar do controle deslizante sejam disparados continuamente, mas tem a opção de executar códigos diferentes, dependendo se o controle deslizante ainda está sendo arrastado ou acabou de ser arrastado.
Para fazer isso, expandi a resposta de Andy acima que faz uso da isTrackingpropriedade do controle deslizante . Eu precisava registrar dois estados: sliderHasFinishedTrackinge sliderLastStoredValue.
Meu código corretamente:
não dispara uma ação ao iniciar o arrasto
dispara a ação se o usuário apenas empurrar o controle deslizante com um único toque (o que significa que isTrackingpermanece false)
classSliderExample:UIViewController{var slider:UISlider=UISlider()var sliderHasFinishedTracking:Bool=truevar sliderLastStoredValue:Float!override func loadView(){super.loadView()
slider.minimumValue =100.0
slider.maximumValue =200.0
slider.isContinuous =true
slider.value=100.0self.sliderLastStoredValue = slider.value
slider.addTarget(self, action:#selector(respondToSlideEvents), for: .valueChanged)// add your slider to the view however you like}
func respondToSlideEvents(sender:UISlider){let currentValue:Float=Float(sender.value)print("Event fired. Current value for slider: \(currentValue)%.")if(slider.isTracking){self.sliderHasFinishedTracking =falseprint("Action while the slider is being dragged ⏳")}else{if(self.sliderHasFinishedTracking && currentValue ==self.sliderLastStoredValue){print("Slider has finished tracking and its value hasn't changed, "+"yet event was fired anyway. 🤷")// No need to take action.}else{self.sliderHasFinishedTracking =trueprint("Action upon slider drag/tap finishing ⌛️")}}self.sliderLastStoredValue = currentValue
}}
Crie uma ação e saída para o controle deslizante (ou você pode transformar o remetente da ação para o UISlider) e, na IU, desmarque a caixa de seleção Atualizações Contínuas. Dessa forma, obteremos o valor do controle deslizante apenas quando o controle deslizante parar de arrastar.
Respostas:
Se você não precisa de nenhum dado entre o arrasto, você deve simplesmente definir:
Dessa forma, você receberá o
valueChanged
evento apenas quando o usuário parar de mover o controle deslizante.Versão Swift 5 :
fonte
Events [x] Continuous Updates
configuração para UISliderView. Desmarcar isso definecontinuous
como falso / NÃO.self.mySlider.isContinuous = false
Você pode adicionar uma ação que leva dois parâmetros, remetente e um evento, para UIControlEventValueChanged:
Em seguida, verifique a fase do objeto de toque em seu manipulador:
Swift 4 e 5
Observe que no Interface Builder, ao adicionar uma ação, você também tem a opção de adicionar os parâmetros do remetente e do evento à ação.
fonte
isContinuous = true
em seuUISlider
.Eu uso as notificações "Retoque interno" e "Retoque externo".
Interface Builder:
Conecte ambas as notificações no Interface Builder ao seu método de recebimento. O método pode ser assim:
Em código:
Se você quiser conectá-lo programaticamente, terá algo assim em seu viewWillAppear (ou onde quer que seja adequado), chame:
O método de recebimento seria semelhante a este:
fonte
Como
UISlider
é uma subclasse deUIControl
, você pode definir um alvo e uma ação para eleUIControlEventTouchUpInside
.Se você quiser fazer isso em código, terá a seguinte aparência:
Isso enviará uma
dragEndedForSlider:
mensagem a você quando o toque terminar.Se quiser fazer isso na ponta, você pode clicar com o botão direito do mouse no controle deslizante para obter o menu de conexões e, em seguida, arrastar do soquete “Retocar dentro” para o objeto de destino.
Você também deve adicionar um alvo e uma ação para
UIControlEventTouchUpOutside
e paraUIControlEventTouchCancel
.fonte
UISlider
mudou desde que escrevi esta resposta.UIControlEventTouchCancel
handler no iOS 9. Mas sou capaz de invocarUIControlEventTouchUpInside
eUIControlEventTouchUpOutside
apenas.Swift 5 e Swift 4
Adicione alvo para eventos
touchUpInside
etouchUpOutside
. Você pode fazer isso programaticamente ou a partir do storyboard. É assim que você faz isso programaticamenteEscreva sua função para lidar com o final do arrasto do controle deslizante
fonte
Você pode usar:
para detectar quando os eventos touchDown e touchUp ocorrem no UISlider
fonte
Acho que você precisa do evento de controle
UIControlEventTouchUpInside
.fonte
Resposta rápida 3
Eu tive o mesmo problema e eventualmente fiz isso funcionar, então talvez ajude alguém. Conecte your_Slider a 'Value Changed' no storyboard e quando o slider for movido, "Slider Touched" acionado e quando for solto "Slider Released".
fonte
Conectar
Touch Up Inside
eValue Changed
fonte
Swift 3.1
Às vezes, você desejará que os eventos de arrastar do controle deslizante sejam disparados continuamente, mas tem a opção de executar códigos diferentes, dependendo se o controle deslizante ainda está sendo arrastado ou acabou de ser arrastado.
Para fazer isso, expandi a resposta de Andy acima que faz uso da
isTracking
propriedade do controle deslizante . Eu precisava registrar dois estados:sliderHasFinishedTracking
esliderLastStoredValue
.Meu código corretamente:
não dispara uma ação ao iniciar o arrasto
dispara a ação se o usuário apenas empurrar o controle deslizante com um único toque (o que significa que
isTracking
permanecefalse
)fonte
No Swift 4 você pode usar esta função
1 Primeira etapa: - Adicionando o alvo no controle deslizante
2 Segunda etapa: - Criar uma função
fonte
Talvez você deva adicionar destino para eventos UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel.
Eu encontrei o mesmo problema antes, porque eu não adiciono destino para o evento UIControlEventTouchCancel .
fonte
Tive um problema semelhante recentemente. Aqui está o que eu fiz no Swift:
O código que contém esse valor contínuo é:
O padrão parece ser SIM (verdadeiro). Definir como false faz o que você deseja.
fonte
Tente assim
fonte
RxSwift:
fonte
Crie uma ação e saída para o controle deslizante (ou você pode transformar o remetente da ação para o UISlider) e, na IU, desmarque a caixa de seleção Atualizações Contínuas. Dessa forma, obteremos o valor do controle deslizante apenas quando o controle deslizante parar de arrastar.
fonte