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))];
그러나 이것은 뷰가 서로 아래에있는 경우에만 작동합니다. 서로 옆에보기가있는 경우 스크롤러의 내용을 실제보다 크게 설정하지 않으려면 높이를 추가해야합니다.
답변
자동 레이아웃을 사용하는 경우 해결책 :
-
설정
translatesAutoresizingMaskIntoConstraints
에NO
관련된 모든 뷰에. -
스크롤보기 외부의 제약 조건으로 스크롤보기를 배치하고 크기를 조정하십시오.
-
제한 조건을 사용하여 스크롤보기 내에 서브 뷰를 배치하십시오. 제한 조건이 스크롤보기의 네 모서리 모두에 연결되고 스크롤보기에 의존하여 크기를 확보하지 않아야합니다.
출처 :
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
스크롤 표시기가 숨김으로 설정된 후에 계산이 수행됩니다.
또한 선택적 기능 매개 변수가 있으며 매개 변수를 함수에 전달하여 오프셋 값을 추가 할 수 있습니다.