自定义UISlider:在外部拖动时避免更新

时间:2011-11-27 17:20:23

标签: iphone objective-c uislider

我对iPhone开发很新,我正在构建我的第一个应用程序:) 在我的一个视图控制器中,我构建了一个customSlider,它应该像原生的“slide to unlock”滑块一样。

我现在怀疑的是如何实施“拖外”行为。如上所述,我希望它与原生滑块完全相同,这意味着当手指拖动滑块时,如果滑块移出滑块,则滑块应该为零。

我怀疑不在动画部分(我已经成功使用动画块),但在控制事件部分。我应该使用哪种控制事件?

我正在使用:

[customSlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged];

处理滑动部分(手指滑动光标)和

[customSlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside];

处理释放部分,但问题是如果我将手指释放到外面,则不会调用sliderAction函数。

编辑: 我试图实现@Bruno Domingues给我的解决方案,但我意识到问题是默认情况下UISlider即使将手指拖到它外面也会不断更新(尝试打开例如System中的Brightness部分)首选项,您将看到滑块将继续更新,即使您拖动它以外)。所以我的问题可以重新定义:如何避免这种默认行为,只有在手指移动时才更新滑块?

2 个答案:

答案 0 :(得分:4)

只需中断自定义子类中的touches方法,只将您想要操作的触摸转发给超类,如下所示:

在.h:

@interface CustomSlider : UISlider
@end

in .m:

#import "CustomSlider.h"
@implementation CustomSlider
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    if (touchLocation.x < 0 || touchLocation.y<0)return;
    if (touchLocation.x > self.bounds.size.width || touchLocation.y > self.bounds.size.height)return;
    [super touchesCancelled:touches withEvent:event];
}
@end

请注意,如果您的手指移回控件,此实现将开始更新控件。要消除这种情况,只需在视图外部接收到触摸设置标志,然后在后续触摸方法中检查该标志。

答案 1 :(得分:0)

您需要设置[slider addTarget:self action:@selector(eventDragOutside:) forControlEvents:UIControlEventTouchDragOutside];

添加功能

- (IBAction)eventDragOutside:(UISlider *)sender { sender.value = 0.0f; }