[iphone] 내용에 맞게 UIScrollView의 크기를 자동으로 조정하는 방법

UIScrollView스크롤하는 컨텐츠의 높이 (또는 너비)를 자동으로 조정 하는 방법이 있습니까?

다음과 같은 것 :

[scrollView setContentSize:(CGSizeMake(320, content.height))];



답변

UIScrollView포함 된 하위보기를 기반으로 콘텐츠의 크기를 업데이트하기 위해 내가 찾은 가장 좋은 방법은 다음과 같습니다.

목표 -C

CGRect contentRect = CGRectZero;

for (UIView *view in self.scrollView.subviews) {
    contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;

빠른

let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
    rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size


답변

UIScrollView는 내용의 높이를 자동으로 알지 못합니다. 스스로 높이와 너비를 계산해야합니다

다음과 같이하십시오.

CGFloat scrollViewHeight = 0.0f;
for (UIView* view in scrollView.subviews)
{
   scrollViewHeight += view.frame.size.height;
}

[scrollView setContentSize:(CGSizeMake(320, scrollViewHeight))];

그러나 이것은 뷰가 서로 아래에있는 경우에만 작동합니다. 서로 옆에보기가있는 경우 스크롤러의 내용을 실제보다 크게 설정하지 않으려면 높이를 추가해야합니다.


답변

자동 레이아웃을 사용하는 경우 해결책 :

  • 설정 translatesAutoresizingMaskIntoConstraintsNO관련된 모든 뷰에.

  • 스크롤보기 외부의 제약 조건으로 스크롤보기를 배치하고 크기를 조정하십시오.

  • 제한 조건을 사용하여 스크롤보기 내에 서브 뷰를 배치하십시오. 제한 조건이 스크롤보기의 네 모서리 모두에 연결되고 스크롤보기에 의존하여 크기를 확보하지 않아야합니다.

출처 :
https://developer.apple.com/library/ios/technotes/tn2154/_index.html


답변

나는 이것을 Espuz와 JCC의 답변에 추가했습니다. 서브 뷰의 y 위치를 사용하며 스크롤 막대를 포함하지 않습니다. 편집 표시되는 가장 낮은 하위 뷰의 맨 아래를 사용합니다.

+ (CGFloat) bottomOfLowestContent:(UIView*) view
{
    CGFloat lowestPoint = 0.0;

    BOOL restoreHorizontal = NO;
    BOOL restoreVertical = NO;

    if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
    {
        if ([(UIScrollView*)view showsHorizontalScrollIndicator])
        {
            restoreHorizontal = YES;
            [(UIScrollView*)view setShowsHorizontalScrollIndicator:NO];
        }
        if ([(UIScrollView*)view showsVerticalScrollIndicator])
        {
            restoreVertical = YES;
            [(UIScrollView*)view setShowsVerticalScrollIndicator:NO];
        }
    }
    for (UIView *subView in view.subviews)
    {
        if (!subView.hidden)
        {
            CGFloat maxY = CGRectGetMaxY(subView.frame);
            if (maxY > lowestPoint)
            {
                lowestPoint = maxY;
            }
        }
    }
    if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
    {
        if (restoreHorizontal)
        {
            [(UIScrollView*)view setShowsHorizontalScrollIndicator:YES];
        }
        if (restoreVertical)
        {
            [(UIScrollView*)view setShowsVerticalScrollIndicator:YES];
        }
    }

    return lowestPoint;
}


답변

너무 게으른 사람이라면 누구나 신속하게 받아 들일 수있는 대답입니다 🙂

var contentRect = CGRectZero
for view in self.scrollView.subviews {
    contentRect = CGRectUnion(contentRect, view.frame)
}
self.scrollView.contentSize = contentRect.size


답변

@leviatan의 답변에 대한 스위프트 3의 적응은 다음과 같습니다.

신장

import UIKit


extension UIScrollView {

    func resizeScrollViewContentSize() {

        var contentRect = CGRect.zero

        for view in self.subviews {

            contentRect = contentRect.union(view.frame)

        }

        self.contentSize = contentRect.size

    }

}

용법

scrollView.resizeScrollViewContentSize()

사용하기 매우 편리합니다!


답변

다음 확장은 Swift 에서 도움이 될 것입니다 .

extension UIScrollView{
    func setContentViewSize(offset:CGFloat = 0.0) {
        // dont show scroll indicators
        showsHorizontalScrollIndicator = false
        showsVerticalScrollIndicator = false

        var maxHeight : CGFloat = 0
        for view in subviews {
            if view.isHidden {
                continue
            }
            let newHeight = view.frame.origin.y + view.frame.height
            if newHeight > maxHeight {
                maxHeight = newHeight
            }
        }
        // set content size
        contentSize = CGSize(width: contentSize.width, height: maxHeight + offset)
        // show scroll indicators
        showsHorizontalScrollIndicator = true
        showsVerticalScrollIndicator = true
    }
}

논리는 주어진 답변과 동일합니다. 그러나 숨겨진 표시를 생략하고 UIScrollView스크롤 표시기가 숨김으로 설정된 후에 계산이 수행됩니다.

또한 선택적 기능 매개 변수가 있으며 매개 변수를 함수에 전달하여 오프셋 값을 추가 할 수 있습니다.