UIScrollView가 스크롤되지 않음


128

나는 UIScrollView많은 UIImageViews, UILabels 등 을 포함하고 있습니다 ... 라벨이 훨씬 길지만 UIScrollView앱을 실행할 때 클릭하고 아래로 스크롤 할 수 없습니다 ...

왜 이것이 될 수 있습니까?

감사


답변:


169

항상 완전한 작업 코드 스 니펫을 표시하는 것이 좋습니다.

// in viewDidLoad (if using Autolayout check note below):

UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set

[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc

myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size

스위프트 4.0

let myScrollView
let contentView

// scrollview won't scroll unless content size explicitly set

myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc

myScrollView.contentSize = contentView.frame.size //sets ScrollView content size

IB에서 contentSize를 설정하는 방법을 찾지 못했습니다 (Xcode 5.0 기준) .

참고 : 자동 레이아웃을 사용하는 경우이 코드를 넣는 가장 좋은 -(void)viewDidLayoutSubviews방법 은 메서드 안에 있습니다.


12
myScrollView.delegate = selfALSO 를 설정하는 것을 잊지 마십시오. 여전히 작동하지 않으면 아래의 답변에 훌륭한 조언이 있습니다 (xib / StoryBoard로 이동하여 "AutoLayout"이 비활성화되어 있는지 확인하십시오). 프로 팁 : <UIScrollViewDelegate>UIScrollView를 프로그래밍 방식으로 스크롤하는 등의 작업을 수행하려는 경우 .h 파일에 포함시킬 수도 있습니다 .
Albert Renshaw

1
@AlbertRenshaw 당신은 +1을 줄 수 있도록 답변을 추가해야합니다 :) AutoLayout은 나에게 문제였습니다 .... 4 시간 동안 나를 미치게했습니다.
병리학 자

2
코드를 넣으면 효과가 있습니다 viewDidLayoutSubviews.
Amr Lotfy

나에게 문제는 모든 것이 화면에 맞게 스크롤 할 필요가 없다는 것입니다.
다니엘 스프링거

122

contentSize를 올바르게 설정 한 후에도보기를 스크롤 할 수 없으면 Interface Builder-> File Inspector에서 "AutoLayout 사용" 을 선택 취소 하십시오.


164
또는 viewDidLayoutSubviews : 에서 contentSize 를 설정할 수 있으며 자동 레이아웃이 완료된 후에 적용됩니다.
Chris Vasselli

2
@ "크리스 Vasselli"내 문제를 죽이는 .. GR8 .. :-)
Ayaz

3
Chris의 의견은 별도의 답변이어야합니다!
ninjaneer

1
크리스 바 셀리 너무 감사합니다! 자동 레이아웃을 사용하면 viewDidLoad에서 작동하지 않지만 viewDidLayoutSubviews에서 작동합니다!
Romain

1
와우, 나는이 모든 의견을 전에는 눈치 채지 못했다! 많은 분들을 도와 드리겠습니다. 방금 별도의 답변을 게시 했으므로 찾기가 더 쉬울 것입니다.
Chris Vasselli

68

contentSize스크롤보기가 제대로 스크롤 되려면 스크롤보기 의 속성 을 설정해야합니다 .

당신이 자동 레이아웃을 사용하는 경우 설정해야합니다 contentSizeviewDidLayoutSubviews그것이 자동 레이아웃이 완료된 이후에 적용하기 위해.

코드는 다음과 같습니다.

-(void)viewDidLayoutSubviews
{
    // The scrollview needs to know the content size for it to work correctly
    self.scrollView.contentSize = CGSizeMake(
        self.scrollContent.frame.size.width,
        self.scrollContent.frame.size.height + 300
    );
}

고마워 톤 .. 이것은 어떤 이유로 든 값 contentSize을의 크기로 설정하더라도 contentViewscrollView와 contentView의 크기가 동일하게 설정된 것처럼 보이기 때문에 효과가있었습니다. 그러나 높이를 높이 contentSize보다 큰 값으로 설정 contentView하면 효과가 있습니다.
Skywalker

viewDidLayoutSubviews수명주기 동안 여러 번 호출 될 수 있으므로 예상보다 높이가 커질 위험이 있습니다.
anon_nerd

@anon_nerd는 이미 호출되었는지 확인하고 그렇지 않은 경우에만 높이 추가
Daniel Springer

45

위의 답변은 정확합니다-스크롤을 발생 시키려면 내용 크기를 설정해야합니다.

인터페이스 빌더를 사용하는 경우이를 수행하는 깔끔한 방법은 사용자 정의 런타임 속성을 사용하는 것입니다. 예 :

여기에 이미지 설명을 입력하십시오


이것은 나를 위해 아무것도하지 않았다.
coolcool1994

4
죄송합니다. 사진에 {0, 0}이 표시되지만 물론 충분히 큰 숫자를 입력해야합니다.. . 이 방법은 콘텐츠 크기를 미리 알고있는 간단한보기에만 작동합니다. . . (사실 복잡한 뷰의 경우 어쨌든 순수한 코드를 권장합니다).
Jasper Blues

프로그래밍 방식으로 수행하는 것보다 훨씬 덜 해킹 적입니다. 감사합니다!
Jake Stoeffler

1
@JakeStoeffler 환영합니다! :) IB를 사용할 때 모든 구성을 조각화하지 않고 유지합니다. 그러나 상황이 복잡해지면 (재사용 가능한 뷰 위젯, 모델 어댑터, 레이어 조작, CAAnimations 등) 완전히 프로그래밍 방식의 뷰를 선호합니다. . . 더 유창합니다.
재스퍼 블루스

나는 이것을 시도했지만보기가 나타날 때 작동하지만 방향 변경시 위의 화면에 정의 된 contentSize가 무시되고 내 로그에 contentSize가 다시 0,0으로 설정되어 있다고 말합니다. 어떻게 고칠 수 있습니까?
Shoogle

40

콘텐츠 크기를 큰 숫자로 조정하십시오. 내용 크기가 제어 크기보다 큰 경우에도 스크롤보기가 스크롤되지 않는 이유를 이해할 수 없었습니다. 콘텐츠 크기가 필요한 것보다 작 으면 작동하지 않는다는 것을 알았습니다.

self.scrollView.contentSize = CGSizeMake(2000, 2000);

2000 대신에 큰 숫자를 입력 할 수 있습니다. 그리고 그것이 작동한다면, 크기를 조정할 때 콘텐츠 크기가 충분하지 않다는 것을 의미합니다.

스크롤보기가 작동하는 데 위임이 필요하지 않습니다.


2
천재-무슨 일이 일어나고 있는지 확인하는 간단한 방법. 무리 감사!
미친 침팬지

13

스크롤보기의 contentSize 속성이 올바른 크기로 설정되어 있는지 확인하십시오 (예 : 모든 내용을 포함하기에 충분한 크기).


1
프로그래밍 방식으로이 작업을 수행해야합니까? 아니면 IB에서 할 수 있습니까?
Mark

IB를 사용하는 경우 IB를 설정할 수 있습니다 (아래 참조). . (별도의 답변이므로 사진을 포함시킬 수 있습니다).
Jasper Blues

7

'자동 레이아웃 사용'을 선택 취소하면 나에게 속임수가 있습니다.

환경 : xCode 5.0.2 스토리 보드 ios7


5

필자의 경우 delaysContentTouchesscrollView 내부의 객체가 scrollView 자체를 처리하지 않고 터치 이벤트를 캡처하고 자체 처리하기 때문에 true 로 설정 해야했습니다.


나는 같은 문제가 있습니다. 나에게 문제는 delaysContentTouches를 true로 설정하면 사과 연필로 품질이 낮은 도면으로 끝납니다. 그러나 이것은 가장 중요한 경우입니다 :) 대부분의 경우 문제를 해결합니다
RomOne

4

세트 contentSize의 특성 UIScrollviewViewDidLayoutSubviews방법. 이 같은

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}

3

스크롤 할 내용의 크기를 스크롤보기의 크기보다 작게 설정하여 스크롤보기가 스크롤되지 않는 이유에 대한 아이디어. 스크롤하는 동안 컨텐츠를 탐색하려면 컨텐츠를 스크롤보기의 크기보다 크게 설정해야합니다.

확대 / 축소와 같은 개념으로 확대 / 축소 작업을 통해 적용되는 확대 / 축소의 최소값과 최대 값을 설정합니다.

어서 오십시오 :)


3

위의 작은 추가 사항 중 하나는 스크롤보기가 스크롤되지 않는 실제 이유이지만 때로는 염두에 두지 않고 스크롤보기가 IB가 아닌 코드를 통해 추가 될 때 특별한 이유 일 수 있습니다. 하위 뷰가 아닌 상위보기에 하위보기를 추가했을 수 있습니다 scrollview 이것은 서브 뷰가 스크롤되지 않도록합니다.

콘텐츠 크기를 부모보기 프레임보다 크게 설정하고 유지하십시오 (duhh !!)


3

처음 시도 할 때 작동하게 만들었습니다. 자동 레이아웃 및 모든 기능으로 추가 코드가 없습니다. 그런 다음 컬렉션 뷰가 바나나로 이동하여 런타임에 충돌이 발생하여 잘못된 것을 찾을 수 없으므로 삭제하고 다시 만들었습니다 (Xcode 10 Beta 4를 사용하고 있습니다). 그런 다음 스크롤이 사라졌습니다. 그래도 컬렉션 뷰가 다시 작동했습니다!

몇 시간 후에 .. 이것이 나를 위해 고쳐 준 것입니다. 나는 다음과 같은 레이아웃을 가졌다.

UIView

  • 안전 구역
  • 스크롤보기
    • 내용보기

그것은 모든 제약 조건에 있습니다. 안전 영역은 시스템에 의해 자동으로 정의됩니다. 최악의 경우 스크롤 및 내용보기에 대한 모든 제약 조건을 제거하고 IB를 재설정 / 생성 하지 마십시오 . 수동으로 만들면 작동합니다.

  • 스크롤보기의 경우 : 후행 / 상단을 안전 영역에 정렬하십시오. 너비 / 높이를 안전 영역과 동일 .
  • 콘텐츠 뷰의 경우 : 후행 / 리딩 / 상단 / 하단을 Superview (스크롤 뷰)에 정렬

기본적으로 개념은 안전 영역에 맞는 내용보기에 맞는 스크롤보기를 갖는 것입니다.

그러나 그렇게 작동하지 않았습니다. 컨텐츠 뷰의 높이가 누락되었습니다. 내가 할 수있는 모든 것을 시도했지만 트릭을 수행하는 유일한 사람은 컨트롤 뷰 콘텐츠를 만든 콘텐츠 뷰 높이입니다 . 그것은 고정 높이를 정의했습니다.이 값은 뷰 컨트롤러의 크기 (실제 디스플레이보다 길고 모든 하위 뷰를 포함하는 자유 형식으로 정의 됨)에서 계산되어 마침내 다시 작동했습니다!


당신은 매우 환영합니다! 나는 당신이 어떻게 느끼는지 정확히 알고 있습니다.
;;)

Thaaaaks, 나는 많은 시간을 보냈고 이것은 내 문제를 해결했다
Andoni Da Silva

3

viewDidLayoutSubviews존재하지 않는 메시지 (IOS8 / swift) 가 표시되면 대신 다음을 사용하십시오.

override func viewDidAppear(animated: Bool)

이것은 나를 위해 그것을 고정


2

전에 언급되지 않은 것!

콘센트가 scrollView에 올바르게 연결되어 있는지 확인하십시오! 채워진 원이 있어야하지만 원을 채워도 scrollView가 연결되지 않았을 수 있으므로 다시 확인하십시오! 원 위로 마우스를 가져 가서 실제 스크롤보기가 강조 표시되는지 확인하십시오! (이것은 나를위한 사건이었다)

//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

2

튜토리얼을 따른 경우 코드가 올바른 시간이지만 많은 초보자가 모르는 것은 scrollView가 시뮬레이터를 통해 정상적으로 스크롤 되지 않는다는 것입니다 . 당신이 마우스 패드에 눌러 경우에만 스크롤 생각됩니다 동시에 스크롤. 많은 숙련 된 XCode / Swift / Obj-C 사용자는이 작업을 수행하는 데 익숙하므로 초보자가이를 간과 할 수있는 방법을 모릅니다. Ciao :-)

@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(scrollView)
    // Do any additional setup after the view
}

override func viewWillLayoutSubviews(){
    super.viewWillLayoutSubviews()
    scrollView.contentSize = CGSize(width: 375, height: 800)
}

이 코드는 위에서 말한 것을 수행하는 한 완벽하게 작동합니다.


1

다른 솔루션으로도 문제가 해결되지 않으면 실제로 스크롤보기가 UIScrollViewInterface Builder에 있는지 다시 확인하십시오 .

지난 며칠 동안 어느 시점에서 클래스 가 인스펙터에서 말했지만 내 UIScrollView 유형자연스럽게로 변경되었습니다 . 을 사용하고 있습니다.UIViewUIScrollViewXcode 5.1 (5B130a)

새 스크롤보기를 작성하고 이전보기에서 측정 값, 설정 및 구속 조건을 복사하거나 파일 UIScrollView에서 보기를 수동으로 변경할 수 있습니다 xib. 나는 비교를하고 다음과 같은 차이점을 발견했다.

실물:

<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>

유형이 자발적으로 변경된 후 :

<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>

그래서 <view>줄을 원래 <scrollView>줄로 바꿨 습니다.

또한 뷰의 닫기 태그를 </view>로 바꿨 습니다 </scrollView>.

id를 현재보기와 동일하게 유지하십시오 (이 경우 id = "qRn-TP-cXd").

또한 앱의 파생 데이터를 삭제하여 Xcode의 캐시에서 xib를 플러시해야했습니다.

  • Xcode->Window->Organizer->Projects, 파생 된 데이터 라인에서 프로젝트를 선택하고 삭제 ...를 클릭하십시오.

또는 기기를 사용하는 경우 :

  • Xcode->Window->Organizer->Device, 기기-> 응용 프로그램을 선택하고 앱을 선택한 다음 (-)를 클릭하십시오.

이제 프로젝트를 정리하고 시뮬레이터 / 장치에서 앱을 제거하십시오.

  • Xcode->Product->Clean
  • iOS 에서 (X)를 Simulator/device->press길게 눌러 app->click제거

그런 다음 앱을 빌드하고 실행할 수 있고 스크롤 기능을 다시 가질 수 있어야합니다.

추신 : 스크롤보기의 내용 크기를 설정 viewDidLayoutSubviews하거나 자동 레이아웃을 해제 할 필요가 없었지만 YMMV.


1

귀하 scrollViewcontainerView일부 유형 의 하위보기 인 경우 귀하 가 scrollView의 프레임 또는 경계 내에 있는지 확인하십시오 containerView. 나는 containerView.clipsToBounds = NO여전히 scrollView를 볼 수 있었지만 scrollView경계 내에 없었기 때문에 containerView터치 이벤트를 감지하지 못했습니다.

예를 들면 다음과 같습니다.

containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;

scrollView는 볼 수 있지만 사용자 상호 작용은받지 않습니다.


1

viewDidLayoutSubviewsAutolayout 에서 다음 코드를 추가 했습니다. 모든 답변을 시도한 후 :

- (void)viewDidLayoutSubviews
{
    self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);

}

//set the height of content size as required

1

를 추가 UIScrollViewDelegate하고 다음 코드 추가하는 viewDidAppear방법은 나를 위해 그것을 해결했습니다.

@interface testScrollViewController () <UIScrollViewDelegate>

-(void)viewDidAppear:(BOOL)animated {
    self.scrollView.delegate = self;
    self.scrollView.scrollEnabled = YES;
    self.scrollView.contentSize = CGSizeMake(375, 800);
}

1

내 문제는 다음과 같이 해결되었습니다.

  1. scrollView의 contentSize를 큰 높이로 설정
  2. 그러나 scrollView 내의 뷰에서 상단 및 / 또는 하단 제약 조건을 수정해야했습니다. 이는 스크롤 표시기가 화면에 표시되었지만 내용이 스크롤되지 않았 음을 의미합니다.

안전 영역 및 / 또는 수퍼 뷰에 바인딩 된 상단 및 / 또는 하단 구속 조건을 제거하면 scrollView 내부의 뷰가 다시 스크롤되어 화면 하단의 상단에 고정되지 않습니다!

희망은 이것이이 특정 문제로 다른 사람의 고통에서 멈추는 것을 희망합니다.


1

또 다른 재미있는 경우 :

scrollview.superview.userInteractionEnabled가 true 여야합니다.

부모를 이해하기 위해 이것을 쫓는 데 2 ​​시간 이상을 낭비했습니다 .UIImageView는 당연히 userInteractionEnabled == false입니다.


0

이 스레드에서 제공된 답변에 실패한 후 솔루션 으로이 기사 를 우연히 발견했습니다 .

자동 레이아웃으로 스크롤보기를 설정하는 데 직관적이지 않은 두 가지가 있습니다.

  1. contentview와 scrollview 사이의 여백으로 설정 한 구속 조건은 contentview의 크기에 영향을 미치지 않습니다. 그들은 실제로 여백입니다. 그리고 그것을 작동 시키려면 contentview의 크기가 고정되어 있어야합니다.
  2. 고정 크기의 요령은 컨텐츠 뷰의 너비를 스크롤 뷰의 부모 너비와 동일하게 설정할 수 있다는 것입니다. 왼쪽의 트리에서 두 뷰를 모두 선택하고 동일한 너비 제약 조건을 추가하십시오.

이것은 그 기사의 요지입니다. 그림을 포함한 자세한 설명을 확인하십시오.


@PredragManojlovic 이보다 더 일반적인 방법은 무엇입니까? 이것이 자동 레이아웃을 사용하여 스크롤보기를 올바르게 작동시킬 수있는 유일한 방법입니다.
H. de Jonge 2012 년

0

이 AutoLayout 문제로 클래스 대신 대신 ViewController사용 하면 ... 나 자신을 추가 하면 작동한다는 것을 알았 습니다.UIViewUIScrollViewUIScrollView


0

IB에서도 같은 문제가있었습니다.

scrollView의 선행, 후행, 상단 및 하단을 superView로 설정 한 후. containerView를 스크롤 할 수 있도록 다음과 같이 변경했습니다.

scrollView를 가로 방향으로 만 스크롤하려면 scrollView의 centerY = ContainerView의 centerY를 사용하여 제약 조건을 만듭니다.

세로로 스크롤 가능하게 만들려면 scrollView의 centerX = ContainerView의 centerX를 만드십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.