IT TIP

UIScrollView 콘텐츠의 보이는 사각형 가져 오기

itqueen 2020. 11. 2. 20:12
반응형

UIScrollView 콘텐츠의 보이는 사각형 가져 오기


실제로 화면에 표시되는 표시된보기의 컨텐츠의 직사각형 (CGRect)을 찾으려면 어떻게해야합니까?

myScrollView.bounds

위의 코드는 확대 / 축소가 없을 때 작동하지만 확대 / 축소를 허용하자마자 1이 아닌 확대 / 축소 배율에서 중단됩니다.

명확히하기 위해 스크롤 뷰 콘텐츠의 보이는 영역을 콘텐츠에 상대적으로 포함하는 CGRect를 원합니다. (즉, 줌 스케일 2 인 경우 rect의 크기는 스크롤 뷰 크기의 절반이되고, 줌 스케일 0.5 인 경우 두 배가됩니다.)


아니면 간단히 할 수 있습니다

CGRect visibleRect = [scrollView convertRect:scrollView.bounds toView:zoomedSubview];

빠른

let visibleRect = scrollView.convert(scrollView.bounds, to: zoomedSubview)

내 자신의 질문에 대답하는 것은 주로 Jim Dovey의 대답 덕분에 트릭을 제대로 수행하지 못했지만 대답의 근거를 제공했습니다.

CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.bounds.size;

float theScale = 1.0 / scale;
visibleRect.origin.x *= theScale;
visibleRect.origin.y *= theScale;
visibleRect.size.width *= theScale;
visibleRect.size.height *= theScale;

주요 차이점은 visibleRect 의 크기가 콘텐츠보기의 크기가 scrollView.bounds.size아니라 여야 한다는 것 scrollView.contentSize입니다. 또한 수학을 약간 단순화했으며 isless()코드가 커질 때마다 코드를 깨뜨릴 수있는 용도를 보지 못했습니다 .


다음과 같이 UIScrollView의 contentOffset 및 contentSize 속성을 사용하여 계산해야합니다.

CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.contentSize;

그런 다음 온 전성 테스트를 위해 기록 할 수 있습니다.

NSLog( @"Visible rect: %@", NSStringFromCGRect(visibleRect) );

확대 / 축소 (contentSize 속성에 의해 아직 수행되지 않은 경우)를 고려하려면 각 좌표를 zoomScale로 나누거나 더 나은 성능을 위해 1.0 / zoomScale을 곱해야합니다.

CGFloat scale = (CGFloat) 1.0 / scrollView.zoomScale;
if ( isless(scale, 1.0) )      // you need to #include <math.h> for isless()
{
    visibleRect.origin.x *= scale;
    visibleRect.origin.y *= scale;
    visibleRect.size.width *= scale;
    visibleRect.size.height *= scale;
}

제쳐두고 : 나는 math.h에서 isless (), isgreater (), isequal () 등을 사용합니다. .


편집 : 계산할 때 bounds.size대신 사용해야 합니다 .contentSizevisibleRect.size


더 짧은 버전 :

CGRect visibleRect = CGRectApplyAffineTransform(scrollView.bounds, CGAffineTransformMakeScale(1.0 / scrollView.zoomScale, 1.0 / scrollView.zoomScale));

이것이 정의 된 동작인지 확실하지 않지만 거의 모든 UIView 하위 클래스의 원본이 bounds(0,0)으로 설정됩니다. 그러나 UIScrollViews에는 원본이로 설정되어 contentOffset있습니다.


좀 더 일반적인 해결책은 다음과 같습니다.

 [scrollView convertRect:scrollView.bounds
                             toView:[scrollView.delegate viewForZoomingInScrollView:scrollView]];

CGRect visibleRect;
visibleRect.origin = scrollView.contentOffset;
visibleRect.size = scrollView.frame.size;

UIScrollView가 해당 사각형을 직접 제공한다고 생각하지 않지만 계산에 필요한 모든 항목이 있다고 생각합니다.

경계, contentOffset 및 zoomScale의 조합은 찾고있는 사각형을 만드는 데 필요한 모든 것입니다.


스위프트 4.0 :

내 대답은 Swift 4.0에 대한 Trenskow의 대답조정합니다 .

let visible = scrollView.convert(scrollView.bounds, to: subView)

여기서는 scrollView스크롤의보기이고, 확대 / 축소 가능하고 스크롤 내부의 모든 내용을 포함하는 subView내부보기 scrollView입니다.

참고 URL : https://stackoverflow.com/questions/868288/getting-the-visible-rect-of-an-uiscrollviews-content

반응형