Programing

contentOffset을 프로그래밍 방식으로 설정하면 scrollViewDidScroll이 트리거됩니다.

lottogame 2020. 12. 6. 20:53
반응형

contentOffset을 프로그래밍 방식으로 설정하면 scrollViewDidScroll이 트리거됩니다.


UIScrollView한 페이지에 몇 개 있습니다. 개별적으로 스크롤하거나 함께 잠그고 하나로 스크롤 할 수 있습니다. 잠겨있을 때 문제가 발생합니다.

내가 사용 UIScrollViewDelegate하고 scrollViewDidScroll:움직임을 추적 할 수 있습니다. 나는 쿼리 contentOffsetUIScrollView변경 어떤을 한 후 자신의 설정에 의해 다른 스크롤 뷰에 변화를 반영하는 contentOffset경기에 속성을.

좋아요 .... 내가 많은 추가 전화를 발견 한 것을 제외하고. 프로그래밍 방식으로 contentOffset스크롤 뷰를 변경하면 대리자 메서드 scrollViewDidScroll:가 호출됩니다. setContentOffset:animated:대신 사용 시도했지만 여전히 델리게이트에서 트리거를 받고 있습니다.

내 contentOffsets를 트리거하지 않도록 프로그래밍 방식으로 수정하려면 어떻게해야 scrollViewDidScroll:합니까?

구현 노트 .... 각각 UIScrollViewUIView델리게이트 패턴을 사용 UIViewController하여 다양한 contentOffset값을 조정하는 표현 서브 클래스 를 콜백 하는 커스텀의 일부입니다 .


원점을 원하는 콘텐츠 오프셋 으로 설정하여의 경계를 설정하여 UIScrollView대리자 callback을 트리거하지 않고 의 콘텐츠 오프셋을 변경할 수 있습니다 .scrollViewDidScroll:UIScrollView

CGRect scrollBounds = scrollView.bounds;
scrollBounds.origin = desiredContentOffset;
scrollView.bounds = scrollBounds;

시험

id scrollDelegate = scrollView.delegate;
scrollView.delegate = nil;
scrollView.contentOffset = point;
scrollView.delegate = scrollDelegate;

나를 위해 일했습니다.


UIScrollView의 기존 속성을 사용하는 것은 어떻습니까?

if(scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating) {
    //your code
}

@Tark의 대답을 단순화 scrollViewDidScroll하면 다음과 같이 한 줄로 실행 하지 않고도 scrollview를 배치 할 수 있습니다 .

scrollView.bounds.origin = CGPoint(x:0, y:100); // whatever values you'd like

또 다른 방법은 scrollViewDidScroll 델리게이트에 로직을 추가하여 콘텐츠 오프셋의 변경이 프로그래밍 방식으로 트리거되었는지 또는 사용자의 터치에 의해 트리거되었는지 여부를 결정하는 것입니다.

  • 클래스에 'isManualScroll'부울 변수를 추가하십시오.
  • 초기 값을 false로 설정하십시오.
  • scrollViewWillBeginDragging에서 true로 설정하십시오.
  • scrollViewDidScroll에서 그것이 참인지 확인하고 그럴 경우에만 응답하십시오.
  • scrollViewDidEndDecelerating에서 false로 설정하십시오.
  • scrollViewWillEndDragging에서 속도가 0이면 false로 설정하는 논리를 추가합니다 (이 경우 scrollViewDidEndDecelerating이 호출되지 않음).

이것은 질문에 대한 직접적인 대답은 아니지만, 그러한 가짜 메시지를 받고 있다면 경계를 변경하고 있기 때문일 수도 있습니다. 스크롤 뷰에 하위 뷰를 제거하고 추가하는 "tilePages"메서드와 함께 일부 Apple 샘플 코드를 사용하고 있습니다. 이것은 드물게 추가 scrollViewDidScroll : 메시지를 즉시 호출하므로 예상하지 못한 재귀가 발생합니다. 제 경우에는 충돌을 찾기가 불가능 해졌습니다.

내가 한 일은 메인 대기열에서 통화를 대기열에 넣는 것입니다.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if(scrollView == yourScrollView) {
        // dispatch fixes some recursive call to scrollViewDidScroll in tilePages (related to removeFromSuperView)
        // The reason can be found here: http://stackoverflow.com/questions/9418311
        dispatch_async(dispatch_get_main_queue(), ^{ [self tilePages]; });
    }
}

참고 URL : https://stackoverflow.com/questions/9418311/setting-contentoffset-programmatically-triggers-scrollviewdidscroll

반응형