我做了一个UISlider
像“滑动解锁”滑块一样的作品。我需要做的是确定抬起手指被归类为touchUpOUTSIDE
和不归类的点touchUpINSIDE
。这是您将手指滑过滑块末端的位置。我想这与 a 相同UIButton
,您可以按下按钮然后将手指从按钮上滑开,根据您走多远,它仍然可以归类为touchUpInside
. 如果可能的话,我想用圆圈标记目标区域。
一旦我设法找到了这一点,是否可以改变它?所以我可以有更大的目标区域?
我真的不知道从哪里开始。谢谢
我做了一个UISlider
像“滑动解锁”滑块一样的作品。我需要做的是确定抬起手指被归类为touchUpOUTSIDE
和不归类的点touchUpINSIDE
。这是您将手指滑过滑块末端的位置。我想这与 a 相同UIButton
,您可以按下按钮然后将手指从按钮上滑开,根据您走多远,它仍然可以归类为touchUpInside
. 如果可能的话,我想用圆圈标记目标区域。
一旦我设法找到了这一点,是否可以改变它?所以我可以有更大的目标区域?
我真的不知道从哪里开始。谢谢
我花了几个小时,但我已经设法解决了这个问题。我已经做了很多覆盖 touchesMoved、touchesEnded 和 sendAction:action:target:event 的测试,看起来框架类的 70px 内的任何触摸都是触摸 INSIDE。因此,对于 292x52 的 UISlider,从 x:-70 到 x:362 或 y:-70 到 122 的任何触摸都将被视为内部触摸,即使它在框架之外。
我想出了这段代码,它将覆盖一个自定义类,以允许框架周围更大的 100 像素区域算作内部触摸:
#import "UICustomSlider.h"
@implementation UICustomSlider {
BOOL callTouchInside;
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
callTouchInside = NO;
[super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touchLocation = [[touches anyObject] locationInView:self];
if (touchLocation.x > -100 && touchLocation.x < self.bounds.size.width +100 && touchLocation.y > -100 && touchLocation.y < self.bounds.size.height +100) callTouchInside = YES;
[super touchesEnded:touches withEvent:event];
}
-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
if (action == @selector(sliderTouchOutside)) { // This is the selector used for UIControlEventTouchUpOutside
if (callTouchInside == YES) {
NSLog(@"Overriding an outside touch to be an inside touch");
[self sendAction:@selector(UnLockIt) to:target forEvent:event]; // This is the selector used for UIControlEventTouchUpInside
} else {
[super sendAction:action to:target forEvent:event];
}
} else {
[super sendAction:action to:target forEvent:event];
}
}
通过更多的调整,我应该也可以将它用于相反的情况。(使用更近的触摸作为外部触摸)。
根据文档,UIControlEventTouchUpOutside
当手指超出控件范围时触发事件。如果您尝试更改该区域,滑块将随之缩放。为什么不将操作绑定UIControlEventTouchUpOutside
到与 相同UIControlEventTouchUpInside
?