2012-05-04 3 views
1

UISmrollView를 UIScrollView 안에 넣고 확대/축소 한 후에 scrollview의 가운데에 있도록 이미지를 제어하려고합니다. 그리고 나는 이것을 할 수있는 최선의 방법이 확실하지 않습니다.UIview UIScrollview - 프레임, 경계, 중심 혼동

apple 문서는 프레임 속성을 사용하지 말 것을 경고합니다. "경고 변환 속성이 ​​ID 변환이 아닌 경우이 속성의 값은 정의되지 않으므로 무시해야합니다." 그래서 나는있는 ScrollView 누구의 XIB 포함하는 UIViewController 하위에 다음을 사용하여 시도 및 이미지 뷰 포함하고있다 :

scrollView.bounds = 
    CGRectMake 
    (scrollView.contentSize.width/2 - scrollView.center.x, 
    scrollView.contentSize.height/2 - scrollView.center.y, 
    scrollView.bounds.size.width, 
    scrollView.bounds.size.height); 

containedView.center =  
    CGPointMake 
    (containedView.bounds.size.width*scrollView.zoomScale/2, 
    containedView.bounds.size.height*scrollView.zoomScale/2); 

이 정확하게 작동하는 곳 containedView의 폭과 높이가있는 ScrollView보다 큰 그래서 뷰 ​​설정을 그 이후의 스크롤은 포함 된 뷰의 가장자리까지 정확하게 이동합니다. 그러나 이미지의 크기가 scrollView의 너비와 높이보다 작은 경우 이미지는 화면의 왼쪽 상단 모서리에 자기 적으로 끌어 당깁니다. iPad Simulator (only)에서 이미지가 minimumZoom 크기로 수축되면 화면 중앙에 고정됩니다. 자기 매력은 마치 이미지가 가운데에 배치 된 후 UI의 코드가 내 코드를 무시하는 것처럼 매우 매끄 럽습니다. CALayer contentsGravity (kCAGravityTopLeft) 같은 것 같습니다. I가이 때이 방법은 이미지가 작은 경우 중심의 더 나은 일을

// center the image as it becomes smaller than the size of the screen 

CGSize boundsSize = self.bounds.size; 
CGRect frameToCenter = imageView.frame; 

// center horizontally 
if (frameToCenter.size.width < boundsSize.width) 
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
else 
    frameToCenter.origin.x = 0; 

// center vertically 
if (frameToCenter.size.height < boundsSize.height) 
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
else 
    frameToCenter.origin.y = 0; 

imageView.frame = frameToCenter; 

,하지만 :

애플은 (있는 UIScrollView의 하위 클래스에서) 자신의 코드 샘플, photoScroller에 자신의 조언을 모순 내 프로젝트는 일종의 불일치를 가져온다. 예를 들어, scrollView.bounces = NO를 사용하면 높이가 scrollView의 높이보다 작지만 너비가 더 큰 가로 이미지 (왼쪽에서 오른쪽으로 스크롤 할 수 있음)가 왼쪽보다 더 스크롤됩니다 (오른쪽으로 스크롤하면 이미지 가장자리에서 올바르게 멈 춥니 다. 비록 scrollView.bounces = YES이면 가장자리에서 튀어 나와 이미지가 항상 왼쪽에서 잘립니다.) 이미지가 포함 된 scrollview보다 두 치수가 더 큰 경우 이 문제는 강조되고 모든 결과는 깨졌으며 Apple의 문서에 따라 조언을 얻는다면 놀랄 일이 아닙니다.

포럼을 샅샅이 뒤졌고 이에 대한 의견이 많지 않습니다. 나는 정말 분명한 것을 놓치고 있는가?

답변

0

transform 속성을 사용하는 것으로 보이지 않으므로 transform 속성을 사용할 때 frame 속성을 사용하지 않는다는 경고를 무시할 수 있습니다. Apple (와 나머지)과 마찬가지로 frame 속성을 사용하십시오.

+0

이 메서드는 확대/축소시 scrollViewDidZoom에 의해 호출되므로 변환이 더 이상 항등 변환이 아닙니다. 어쨌든, 위에서 언급 한 프레임은이 스크롤 글리치를 도입하고 있습니다. NSLog 각 알고리즘을 사용하는 숫자를, 그들은 동일하게 나타납니다 그래서 조금 더 신비한 찾을 수 있습니다. – foundry

+0

더 정확한, ID 변환을 scrollView 손길이 닿지 않은 유지되지만 이미지 뷰 변경합니다. 그래서 scrollViews '프레임을 사용할 수 있지만 그 용도는 없습니다. – foundry

+0

먼저 이미지를 스크롤 뷰로 가져 오는 알고리즘을 설정할 때이 결함을 발견했습니다. 나는 scrollview를 'aspect fill'하도록 설정하고, 이미지가 항상 올바르게 임포트되지는 않는다는 것을 알아 차렸고 때로는 동일한 이미지로도 임의의 크기 조정이 발생한다는 것을 알았습니다. 프레임 속성을 사용하지 않고 문제가 사라졌습니다 (그러나이 문제를 해결하기 위해 인수했습니다!) – foundry

관련 문제