Это хитроумно - моя идея решения немного ошибочна, но я думаю, что это сработает.
Добавьте прозрачный вид на всю область, и это вид, который вы добавляетераспознаватель жестов при длинном нажатии.Я назову это видом перехватчика, а тот, что позади, будет называться видимым видом.Когда вы обнаружите долгое нажатие на виде перехватчика, вы можете добавить новый вид к видимому виду, не влияя на прикосновения на виде перехватчика, поэтому вы можете отслеживать их и перемещать новый вид на видимом виде.
Если вам нужно обнаружить другие касания, например, в кнопках и других элементах пользовательского интерфейса, которые находятся в видимом представлении, то вы должны создать подкласс UIView
(InterceptorView
) для представления перехватчика и переопределить hitTest:withEvent:
какследует:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
// Notes:
// visibleView is a property of your InterceptorView class
// which should be set to the visible view when the interceptor
// view is created and added over the top of the visible view.
// See if there are any views in the visible view that should receive touches...
// Since the frame of the interceptor view should be the same as the frame of the
// visible view then the point doesn't need coordinate conversion.
UIView* passThroughView = [self.visibleView hitTest:point withEvent:event];
if(passThroughView == nil)
{
// The visible view and its sub-views don't want to receive this touch
// which means it is safe for me to intercept it.
return self;
}
// The visible view wants this touch, so tell the system I don't want it.
return nil;
}
Это будет означать, что ваше представление перехватчика будет обрабатывать длительное нажатие, кроме случаев, когда нажатие находится над интерактивной частью видимого представления, в этом случае это позволит касанию проходить квидимый вид и его подвиды.
Я не проверял это, это всего лишь идея, поэтому, пожалуйста, дайте мне знать, как вы справляетесь с этим:)