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
'IT TIP' 카테고리의 다른 글
| 복잡한 C 선언 (0) | 2020.11.02 |
|---|---|
| Emacs를 사용하여 현재 날짜와 시간을 파일에 어떻게 삽입 할 수 있습니까? (0) | 2020.11.02 |
| 프로젝트로드 오류 : 3 개의 패싯 세부 사항을로드 할 수 없습니다. (0) | 2020.11.02 |
| Angular 2 및 TypeScript로 두 개의 객체 배열을 병합 하시겠습니까? (0) | 2020.11.02 |
| Google지도 v3 : 최소 적용 (0) | 2020.11.02 |