Извлеките и измените точку, в которой touchUpInside меняет touchUpOutside

Я сделал работу UISlider же, как слайдер «slide to unlock». То, что мне нужно сделать, – это определить момент, при котором снятие пальца классифицируется как touchUpOUTSIDE а не touchUpINSIDE . Это та точка, в которой вы скользите пальцем мимо конца слайдера слишком далеко. Я думаю, это то же самое, что и с UIButton , вы можете нажать кнопку, а затем отпустить палец от кнопки и в зависимости от того, как далеко вы продвигаетесь, его все равно можно классифицировать как touchUpInside . Если возможно, я хочу отметить целевую область кружком.

Как только мне удалось найти, где находится этот пункт, можно ли его изменить? Значит, у меня может быть большая целевая область?

Я действительно не знаю, с чего начать. благодаря

Согласно документам, событие UIControlEventTouchUpOutside запускается, когда палец выходит за границы элемента управления. Если вы пытаетесь изменить эту область, слайдер будет масштабироваться. Почему бы не просто связать действие для UIControlEventTouchUpOutside же, как UIControlEventTouchUpInside ?

Мне потребовалось несколько часов, но мне удалось разобраться в этом. Я провел много тестов, переопределяя touchMoved, touchesEnded и sendAction: action: target: event, и кажется, что любое касание в пределах 70 пикселей классов фреймов как касание INSIDE. Таким образом, для UISlider 292×52 любое касание от 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]; } } 

С немного более тщательной настройкой я должен был бы использовать его и для противоположного. (Использование более близкого касания как внешнего касания).

Interesting Posts
Давайте будем гением компьютера.