数時間かかりましたが、なんとか並べ替えることができました。touchesMoved、touchesEnded、sendAction:action:target:eventをオーバーライドして多くのテストを行いましたが、フレームクラスの70px以内のタッチはすべてINSIDEのタッチのようです。したがって、292x52のUISliderの場合、x:-70からx:362またはy:-70から122までのタッチは、フレームの外側であっても、内側のタッチとしてカウントされます。
カスタムクラスをオーバーライドして、フレームの周囲100pxのより大きな領域を内側のタッチとしてカウントできるようにする、このコードを思いつきました。
#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];
}
}
もう少し調整すれば、逆の場合にも使用できるはずです。(外側のタッチとしてより近いタッチを使用)。