Ios возможно, чтобы uiscrollview обнаруживал одно нажатие на пользователя, сохраняя при этом возможности перетаскивания, прокрутки?
В настоящее время я использую UIScrollView для работы как способ прокрутки/перетаскивания курсора/маркера графа, который я показываю в своем приложении. Я использую scrollViewDidScroll и т.д., Чтобы обнаружить позицию contentoffset и манипулировать тем, что я показываю на экране в зависимости от этой позиции.
Мой вопрос в том, можно ли также обнаружить однократное нажатие на экран пользователя и получить эту позицию отвода (чтобы затем установить настройку contentoffset в эту позицию)?
Я прочитал несколько руководств, описывающих создание подкласса uiscrollview, но похоже, что эти подклассы будут ТОЛЬКО учитывать одно нажатие, а не перетаскивание и прокрутки.
Есть ли у кого-нибудь представление о том, как я могу обнаружить однократное нажатие пользователя на моем UIScrollView, все еще имея возможности прокрутки/перетаскивания?
Заранее спасибо!
Ответы
Ответ 1
Используйте следующий код для вашего объекта scrollView:
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
singleTapGestureRecognizer.enabled = YES;
singleTapGestureRecognizer.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTapGestureRecognizer];
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project
}
- (void)singleTap:(UITapGestureRecognizer *)gesture {
//handle taps
}
Ответ 2
Swift 3
let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:)))
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1
scrollViewTapGestureRecognizer.isEnabled = true
scrollViewTapGestureRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer)
func scrollViewTapped(_ sender: UITapGestureRecognizer) {
print("UIScrollView was tapped.")
}
Ответ 3
Заглянули ли вы в UITapGestureRecognizer в scrollView? Я подключил UITapGestureRecognizer к UIScrollView и использовал –gestureRecognizerShouldBegin:
и/или –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
для отмены встроенного панорамирования при желании.
Ответ 4
Первая часть вопроса довольно проста. Если у вас есть подкласс UIScrollView, вы можете просто добавить переопределение atthesEnded, которое выглядит так:
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if ([touch tapCount] == 1) {
CGPoint location = [touch locationInView:self];
[self setContentOffset:location animated:YES];
}
}
В случае просмотра прокрутки на -locationInView для касания на самом деле уже добавлен ContentOffset. Что этот код будет делать, так это прокрутить прокрутку, чтобы точка, к которой пользователь прикасалась, находится в верхнем левом углу окна. Это, вероятно, не то, что вы хотите точно, поэтому вам придется делать такие вещи, как добавление смещения, если вы хотите, чтобы прокрутка заканчивалась на 10 пикселей, или вы сделали бы еще один CGPoint с только значением x из если ваш скроллер не слева направо.
Это не будет мешать возможности прокрутки.