[iphone] UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지하려면 어떻게해야합니까?

참고 : 여기에 제공된 답변 은 저에게 적합하지 않습니다.

UIScrollView (테이블 뷰가 아니라 사용자 지정 항목)가 있으며 사용자가 특정 작업을 수행 할 때 뷰 내에서 스크롤 (끌기 또는 감속)을 종료하고 싶습니다. 예를 들어 다음과 같이 시도했습니다.

[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO];

이미 보이는 rect가 주어지면 스크롤은 그 위치에서 멈출 것이지만 이것은 효과가 없다는 것이 밝혀졌습니다. 분명히 스크롤 뷰는 주어진 rect가 경계에 있고 조치 없음. 내가 할 수 확실히하는 RECT 주면, 정지 스크롤을 얻을 수 밖에 현재 눈에 보이는 경계를하지만,보기의 contentSize 내부. 이로 인해 예상대로보기가 중단되는 것 같지만 다른 위치로 이동합니다. 이 작업을 합리적으로 수행하기 위해 여백에서 약간 놀아 볼 수 있지만, 작업을 수행하는 스크롤 뷰를 중지하는 깨끗한 방법을 아는 사람이 있습니까?

감사.



답변

나는 당신의 원래 솔루션을 약간 가지고 놀았고 이것은 잘 작동하는 것 같습니다. 나는 당신이 거의 가지고 있다고 생각하지만 너무 많이 사용한 rect를 오프셋하고 있었고 rect를 원래 rect로 똑바로 스크롤 할 수 있다는 것을 잊었습니다.

모든 스크롤 작업에 대한 일반화 된 솔루션은 다음과 같습니다.

- (void)killScroll
{
    CGPoint offset = scrollView.contentOffset;
    offset.x -= 1.0;
    offset.y -= 1.0;
    [scrollView setContentOffset:offset animated:NO];
    offset.x += 1.0;
    offset.y += 1.0;
    [scrollView setContentOffset:offset animated:NO];
}

[편집] iOS 4.3 (및 이전 버전)부터이 기능도 작동하는 것으로 보입니다.

- (void)killScroll
{
    CGPoint offset = scrollView.contentOffset;
    [scrollView setContentOffset:offset animated:NO];
}


답변

일반적인 대답은,이다 [scrollView setContentOffset:offset animated:NO]동일하지[scrollView setContentOffset:offset]!

  • [scrollView setContentOffset:offset animated:NO] 실제로 실행중인 애니메이션을 중지합니다.
  • [scrollView setContentOffset:offset] 실행중인 애니메이션을 중지하지 않습니다.
  • 동일 scrollView.contentOffset = offset: 실행중인 애니메이션을 중지하지 않습니다.

이는 어디에도 문서화되어 있지 않지만 iOS 6.1 및 iOS 7.1에서 테스트 한 동작입니다.

따라서 실행중인 애니메이션 / 감속을 중지하는 솔루션 은 다음과 같이 간단합니다.

[scrollView setContentOffset:scrollView.contentOffset animated:NO];

기본적으로 David Liu가 편집 한 답변에서 말한 것. 하지만이 두 API를 것을, 명확하게하고 싶어 하지 동일 .

스위프트 3 :

scrollView.setContentOffset(scrollView.contentOffset, animated:false)


답변

나를 위해 David Lui의 대답 은 나를 위해 작동하지 않았습니다. 이것이 내가 한 일입니다.

- (void)killScroll {
    self.scrollView.scrollEnabled = NO;
    self.scrollView.scrollEnabled = YES;
}

그만한 가치를 위해 iOS 6.0 iPhone Simulator를 사용하고 있습니다.


답변

이것은 스크롤 뷰 및 기타 모든 관련 하위 클래스에 대해 수행하는 작업입니다.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
 {
    *targetContentOffset = scrollView.contentOffset;
 }

이 설정한다 targetContentOffset받는 scrollView가 목표에 도달하기 때문에의 오프셋 전류가 정지하므로 스크롤링하기. 실제로 사용자가 대상을 설정할 수있는 방법을 사용하는 것이 합리적 contentOffset입니다.

빠른

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    targetContentOffset.pointee = scrollView.contentOffset
}


답변

신속하게 스크롤을 중지하십시오 .

scrollView.setContentOffset(scrollView.contentOffset, animated: false)


답변

사실 … 가장 “현대적인”방법은->

scrollview.panGestureRecognizer.enabled = false;
scrollview.panGestureRecognizer.enabled = true;

이렇게하면 현재 터치를 종료하는 잠시 스크롤을 담당하는 제스처 인식기가 비활성화됩니다. 사용자가 다시 스크롤을 시작하려면 손가락을 뗀 후 다시 내려 놓아야합니다.

편집 : 이것은 실제로 사용자의 현재 드래그를 죽이지 만 scrollview가 현재이 상태에 있으면 감속을 즉시 중지하지 않습니다. 이를 위해 허용되는 답변 편집은 xD가 가장 좋은 방법입니다.

[scrollview setContentOffset: scrollview.contentOffset animated:false];


답변

가장 깨끗한 방법은 UIScrollView를 서브 클래 싱하고 자신 만의 setContentOffset 메소드를 제공하는 것입니다. 부울 속성을 설정 하지 않은 경우 에만 메시지를 전달해야 freeze합니다.

이렇게 :

BOOL freeze; // and the @property, @synthesize lines..

-(void)setContentOffset:(CGPoint)offset
{
    if ( !freeze ) [super setContentOffset:offset];
}

그런 다음 고정하려면 :

scrollView.freeze = YES;