iphone - UIScrollView에서 프로그래밍 방식으로 강제 중지 스크롤을 어떻게 할 수 있습니까?



(6)

참고 : 여기에 주어진 대답 은 나를 위해 작동하지 않습니다.

UIScrollView (테이블 뷰가 아니라 사용자 정의 된 것)가 있으며 사용자가 특정 동작을 수행하면 뷰 내부에서 스크롤 (드래그 또는 감속)을 중지하려고합니다. 나는 이것을하는 것을 시도했다 :

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

이미 알고있는 rect가 주어 졌을 때, 스크롤은 그냥 멈추게 될 것이지만, 이것은 아무런 효과가 없다는 것을 알았습니다. 스크롤 뷰는 주어진 rect가 경계 안에 있고 걸리는 것을 보았습니다. 조치 없음. 나는 현재 볼 수있는 경계 바깥에 있는 rect를 제공하지만 뷰의 contentSize 안에는 스크롤을 멈출 수 있습니다. 이것은 예상대로보기를 멈추는 것처럼 보일뿐 아니라 다른 위치로 점프합니다. 이 작업을 합리적으로 처리하려면 약간의 여백을 둘 수는 있지만 그 일을하는 스크롤보기를 중지 할 수있는 확실한 방법을 알고있는 사람이 있습니까?

감사.


Answer #1

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

이렇게 :

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

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

다음, 동결하기 :

scrollView.freeze = YES;

Answer #2

나는 collectionview에서이 방법을 시도했다.

self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()


Answer #3

나에게 데이비드 루이 (David Lui)는 위의 대답을 받아들이지 않았다. 이것은 내가 끝내었던 것이다 :

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

가치가있는 부분을 위해 iOS 6.0 iPhone 시뮬레이터를 사용하고 있습니다.


Answer #4

사실 ... 가장 현대적인 방법은 ->

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

그러면 현재 터치를 죽일 순간 스크롤을 담당하는 제스처 인식기가 비활성화됩니다. 사용자는 손가락을 들어서 다시 내려야 스크롤을 다시 시작할 수 있습니다.

편집 : 이것은 실제로 사용자의 현재 드래그를 중지하지만 scrollview가 현재이 상태에있는 경우 감속을 즉시 중지하지 않습니다. 이렇게하려면 수락 된 답변을 편집하는 것이 가장 좋은 방법입니다. xD

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

Answer #5

이 대답은 나를 위해 일했습니다 : 비활성화 UIScrollView 감속

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    [scrollView setContentOffset:scrollView.contentOffset animated:YES];
}

Answer #6

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

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

이것은 targetContentOffsetscrollView 의 현재 오프셋으로 설정하여 스크롤이 대상에 도달했기 때문에 중지되도록합니다. 실제로 사용자가 목표로하는 contentOffset 설정할 수있는 방법을 사용하는 것이 좋습니다.

빠른

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




uiscrollview