ProgramingTip

UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지해야합니까?

bestdevel 2020. 10. 22. 22:15
반응형

UIScrollView에서 프로그래밍 방식으로 스크롤을 강제 중지해야합니까?


참고 : 여기에 대답 은 저에게 적합하지 않습니다.

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

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

이미 보이는 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;

이 대답은 나를 위해 일했습니다 : Deactivate UIScrollView decelerating

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

collectionview에서이 방법을 시도했습니다.

self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()


이것은 Swift 4.2 에서 저에게 효과적입니다 .

   func killScroll() {
    self.scrollView.isScrollEnabled = false;
    self.scrollView.isScrollEnabled = true;
}

... 확장자 :

extension UIScrollView {
    func killScroll() {
        self.isScrollEnabled = false;
        self.isScrollEnabled = true;

    }
}

스크롤 뷰 내의 특정 UIView가 스 와이프하는 동안 터치의 소스 인 경우에만 스크롤을 비활성화하고 싶었습니다. 복잡한 뷰 계층 구조를 가지고 있었기 때문에 UIView를 UIScrollView 외부로 이동하려면 상당한 리팩토링이 필요했습니다.

해결 방법으로 스크롤을 방지하려는 하위보기에 단일 UIPanGestureRecognizer를 추가했습니다. 이 UIPanGestureRecognizer는 cancelsTouchesInViewUIScrollView의 panGesture가 활성화되는 것을 방지합니다.

약간의 '해킹'이지만 매우 쉬운 변경이며 XIB 또는 스토리 보드를 사용하는 경우 팬 제스처를 문제의 하위보기로 드래그하기 만하면됩니다.

참고 URL : https://stackoverflow.com/questions/3410777/how-can-i-programmatically-force-stop-scrolling-in-a-uiscrollview

반응형