[iphone] UIScrollView에서 스크롤 방향을 찾으십니까?

나는이 UIScrollView허용 된 경우에만 가로 스크롤로, 나는 어느 방향 (왼쪽, 오른쪽) 사용자가 스크롤을 알고 싶습니다. 내가 한 것은 서브 클래스를 작성 UIScrollView하고 touchesMoved메소드를 재정의하는 것이 었습니다 .

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    float now = [touch locationInView:self].x;
    float before = [touch previousLocationInView:self].x;
    NSLog(@"%f %f", before, now);
    if (now > before){
        right = NO;
        NSLog(@"LEFT");
    }
    else{
        right = YES;
        NSLog(@"RIGHT");

    }

}

그러나이 방법은 때로는 움직일 때 전혀 호출되지 않습니다. 어떻게 생각해?



답변

방향을 결정하는 것은 매우 간단하지만 제스처 과정에서 방향이 여러 번 변경 될 수 있습니다. 예를 들어, 페이징이 켜져있는 상태에서 스크롤보기가 있고 사용자가 다음 페이지로 넘어 가기 위해 스 와이프하면 초기 방향이 오른쪽 일 수 있지만 바운스가 설정된 경우 잠시 방향으로 진행되지 않습니다. 잠시 왼쪽으로 가십시오.

방향을 결정하려면 UIScrollView scrollViewDidScroll대리인 을 사용해야합니다 . 이 샘플에서는 lastContentOffset현재 콘텐츠 오프셋을 이전 콘텐츠와 비교하는 데 사용되는 변수를 만들었습니다 . 더 크면 scrollView가 오른쪽으로 스크롤됩니다. 이보다 작 으면 scrollView가 왼쪽으로 스크롤됩니다.

// somewhere in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;

// somewhere in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    ScrollDirection scrollDirection;

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionRight;
    } else if (self.lastContentOffset < scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionLeft;
    }

    self.lastContentOffset = scrollView.contentOffset.x;

    // do whatever you need to with scrollDirection here.    
}

방향을 정의하기 위해 다음 열거 형을 사용하고 있습니다. 첫 번째 값을 ScrollDirectionNone으로 설정하면 변수를 초기화 할 때 해당 방향을 기본값으로 설정하는 이점이 있습니다.

typedef NS_ENUM(NSInteger, ScrollDirection) {
    ScrollDirectionNone,
    ScrollDirectionRight,
    ScrollDirectionLeft,
    ScrollDirectionUp,
    ScrollDirectionDown,
    ScrollDirectionCrazy,
};


답변

… 사용자가 어느 방향 (왼쪽, 오른쪽)으로 스크롤하는지 알고 싶습니다.

이 경우 iOS 5 이상에서를 사용 UIScrollViewDelegate하여 사용자의 팬 동작 방향을 결정하십시오.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
        // handle dragging to the right
    } else {
        // handle dragging to the left
    }
}


답변

사용 scrollViewDidScroll:은 현재 방향을 찾는 좋은 방법입니다.

사용자가 스크롤을 마친 방향을 알고 싶다면 다음을 사용하십시오.

@property (nonatomic) CGFloat lastContentOffset;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    self.lastContentOffset = scrollView.contentOffset.x;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (self.lastContentOffset < scrollView.contentOffset.x) {
        // moved right
    } else if (self.lastContentOffset > scrollView.contentOffset.x) {
        // moved left
    } else {
        // didn't move
    }
}


답변

이를 추적하기 위해 추가 변수를 추가 할 필요가 없습니다. 그냥 사용 UIScrollViewpanGestureRecognizer이 같은 속성을. 불행히도 속도가 0이 아닌 경우에만 작동합니다.

CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
    NSLog(@"Up");
} else if (yVelocity > 0) {
    NSLog(@"Down");
} else {
    NSLog(@"Can't determine direction as velocity is 0");
}

x와 y 구성 요소를 조합하여 위, 아래, 왼쪽 및 오른쪽을 감지 할 수 있습니다.


답변

해결책

func scrollViewDidScroll(scrollView: UIScrollView) {
     if(scrollView.panGestureRecognizer.translationInView(scrollView.superview).y > 0)
     {
         print("up")
     }
    else
    {
         print("down")
    }
}


답변

스위프트 4 :

가로 스크롤의 경우 다음과 같이 간단하게 수행 할 수 있습니다.

if scrollView.panGestureRecognizer.translation(in: scrollView.superview).x > 0 {
   print("left")
} else {
   print("right")
}

수직 스크롤 변경의 .x경우.y


답변

iOS8 Swift에서는이 방법을 사용했습니다.

override func scrollViewDidScroll(scrollView: UIScrollView){

    var frame: CGRect = self.photoButton.frame
    var currentLocation = scrollView.contentOffset.y

    if frame.origin.y > currentLocation{
        println("Going up!")
    }else if frame.origin.y < currentLocation{
        println("Going down!")
    }

    frame.origin.y = scrollView.contentOffset.y + scrollHeight
    photoButton.frame = frame
    view.bringSubviewToFront(photoButton)

}

사용자가 스크롤 할 때 위치를 변경하는 동적보기가있어보기가 화면의 동일한 위치에있는 것처럼 보일 수 있습니다. 사용자가 올라가거나 내려갈 때도 추적하고 있습니다.

다른 방법도 있습니다 :

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if targetContentOffset.memory.y < scrollView.contentOffset.y {
        println("Going up!")
    } else {
        println("Going down!")
    }
}