我对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部分)首选项,您将看到滑块将继续更新,即使您拖动它以外)。所以我的问题可以重新定义:如何避免这种默认行为,只有在手指移动时才更新滑块?
答案 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;
}