수직 팬 제스처를 사용한 수평 스크롤 UIScrollView
-
12-12-2019 - |
문제
수평 패닝은 스크롤 뷰의 그림을 스크롤하지만 수직 패닝은 다른 작업을 수행하는 UIScrollView를 구현하려고 합니다.지금은 그림을 스크롤하는 데는 잘 작동하는 세로 스크롤이 비활성화된 상태로 페이지가 매겨진 UIScrollView가 있습니다. 하지만 세로 팬을 가로채서 그냥 먹히는 세로 팬 대신 내 메서드를 호출하는 방법을 찾으려고 미쳐가고 있습니다. 스크롤뷰.나는 할 수 있었다
UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];
그러면 HandlePanGesture에서 패닝을 완벽하게 제어할 수 있습니다.그러나 이것은 내가 피하려고 하는 모든 스크롤 논리를 본질적으로 다시 작성하게 될 것 같은 느낌이 들기 때문에 특별히 도움이 되지 않습니다.이를 달성하는 방법에 대한 도움이나 지침을 주시면 대단히 감사하겠습니다.
감사해요!
해결책
스크롤보기의 제스처의 사용으로 인해 팬 제스처를 사용하고 싶다면 어려울 것으로 생각합니다.그러나 스 와이프를 사용할 수 있으면 구현하기 쉽습니다.
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
[self.scrollView addGestureRecognizer:swipe];
.
이 This를 테스트했으며 핸들러를 호출하는 것이 좋습니다. 스크롤보기의 팬 제스처 인식기를 비활성화 할 필요가 없습니다 (테스트에서 스크롤보기가 충분히 높고 콘텐츠가 충분히 짧았습니다.수직 스크롤 - 이것이 필요하거나 아닌지는 모르겠습니다.)
다른 팁
iOS 5부터, UIScrollView
그 모습을 드러낸다 UIPanGestureRecognizer
.맞춤 스와이프 설정 delegate
에게 self
GestureRecognizer를 속성이나 ivar로 만들고 클래스가 <UIGestureRecognizerDelegate>
규약.그런 다음 구현 UIGestureRecognizerDelegate
'에스 – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
이렇게:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
{
return NO;
}
return YES; // the default for this method
}
i UIPanGestureRecognizer
를 추가 한 다음 이와 같이 setupgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
를 추가했습니다.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
return YES;
}
return NO;
}
.
gestureRecognizerShouldBegin:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture]) {
if (gestureRecognizer.numberOfTouches > 0) {
CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
if (distX > distY) {
return NO;
}
} else {
return NO;
}
}
return YES;
}
.
위 또는 아래로 패닝 될 때 self.panGesture
만 사용하십시오.
업데이트
https://stackoverflow.com/a/8603839/667834 gestureRecognizerShouldBegin
에 대한 더 나은 방법이있는 것으로 나타납니다.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer isEqual:self.panGesture]) {
if (gestureRecognizer.numberOfTouches > 0) {
CGPoint translation = [self.panGesture velocityInView:self.collectionView];
return fabs(translation.y) > fabs(translation.x);
} else {
return NO;
}
}
return YES;
}
.