2012-02-26 7 views
1

해야 할 때. 크기를 조정하고 서브 뷰를 레이아웃 할 수는 있지만 스크롤 뷰 자체의 내용 크기를 설정하면 맨 아래의 하위 뷰가 잘립니다. 스크롤 뷰의 콘텐츠 크기 높이가 포함 된보기의 높이 합보다 커야하는 이유가 있습니까?있는 UIScrollView 콘텐츠 크기 클리핑 파단 그것이 내가 여러 동적으로 크기를 조정 파단을 포함하는있는 UIScrollView을 가지고 있지

여기에 더 자세히 내 상황입니다 : 나는 여러 파단을 포함하는있는 UIScrollView를 포함하는 수퍼 있습니다. superview의 layoutSubviews 메서드에서 각 하위 뷰의 필요한 크기를 계산 한 다음 프레임을 설정하여 하위 뷰가 화면 사이에 약간의 간격을두고 수직으로 바둑판 식으로 배열되도록합니다. 완료되면 UIScrollView의 콘텐츠 크기 높이를 마지막 하위 뷰 (origin.y + size.height)의 끝으로 설정합니다. 이론적으로 이는 스크롤 뷰의 내용 영역의 맨 아래가 마지막 하위 뷰의 맨 아래에 정확하게 정렬되어야 함을 의미합니다.

하지만 그렇지 않습니다. 대신 마지막 하위 뷰의 멋진 부분이 잘립니다. 그것은 여전히 ​​거기에 - 내가 아래로 스크롤하면 나는 "바운스"동안 나머지 부분을 볼 수 있습니다. 조경 모드에서는 문제가 더 심각합니다. 하위 서브 뷰의 훨씬 더 많은 부분이 보이지 않습니다.

파단 모든 배치 적절히 배치되고있다. 문제는 UIScrollView의 contentSize가 서브 뷰의 높이의 합계와 그 사이의 공간의 합보다 훨씬 커야한다는 것입니다. 이것은 나에게 어떤 의미가되지 않습니다. 또한 크기가 "off"인 양이 다양합니다.이 뷰를 여러 하위 뷰와 함께 여러 번 재사용하고 다른 양만큼 모두 사용합니다. 따라서 단순히 콘텐츠보기 높이에 상수를 추가해도 도움이되지 않습니다.

내용의 크기 (또는 내 높이 계산)이 제대로 작동하지 않을 수있는 원인이 무엇

?

코드 :

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    CGFloat width = self.bounds.size.width - [self subviewLeftMargin] - [self subviewRightMargin]; // All subviews have same width as parent view 

    CGFloat x = [self subviewLeftMargin]; // All subviews should start at the far left of the view 
    CGFloat y = [self spaceBetweenSubviews]; // Running tally of the y coordinate for the next view 

    /* Adjust the subviews */ 
    for(UIView *view in self.theVariousSubviews) { 
     /* Resize the view with the desired width, then let it size its height as needed */ 
     view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, width, view.frame.size.height); 
     CGSize newSize = [view sizeThatFits:view.frame.size]; 

     /* Set the origin */ 
     //The subviews are positioned correctly, so this doesn't seem to be a problem 
     view.frame = CGRectMake(x, y, newSize.width, newSize.height); 

     /* Have the view refresh its own layout */ 
     [view setNeedsLayout]; 

     /* Update the y value for the next subview */ 
     y += newSize.height + [self spaceBetweenSubviews]; 
    } 

    /* Resize the scroll view to ensure it fits all of the content */ 
    CGFloat scrollViewHeight = y; 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, scrollViewHeight); 
    //Content size is set to the same total height of all subviews and spacing, yet it is too small. Why? 
} 

답변

0

안녕하세요 당신의 계산 및 크기 조정 타이밍이 잘못 나에게 보인다. 레이아웃 변경 코드가 누락되지 않아서 문제를 완전히 이해할 수 없었습니다. 저를 친다 무엇

는 두 번 view.frame를 할당하는 새로운 계산 사이에 당신이 당신의 계산에 따라되는 일부 값이 변경 될 수 있습니다 sublayouting와 과정을 차단한다는 것입니다.

난 단지 당신이하고 설계에서 계산을 분리하고 계산하는 동안 메소드를 호출하지 않도록 조언 할 수있다. 그것에 빛을 가져 오려면 계산이 누락 된 샘플 응용 프로그램을 삭제하거나 직접 하위 뷰의 프레임 원점 크기와 scrollview에 대한 contentOffset을 보여주는 NSLog 문을 추가해야합니다. 내 경험에 scrollview 일반적으로 제대로 작동하기 때문에 코드에서 버그를 기대합니다.