답변:
항상 완전한 작업 코드 스 니펫을 표시하는 것이 좋습니다.
// 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
방법 은 메서드 안에 있습니다.
myScrollView.delegate = self
ALSO 를 설정하는 것을 잊지 마십시오. 여전히 작동하지 않으면 아래의 답변에 훌륭한 조언이 있습니다 (xib / StoryBoard로 이동하여 "AutoLayout"이 비활성화되어 있는지 확인하십시오). 프로 팁 : <UIScrollViewDelegate>
UIScrollView를 프로그래밍 방식으로 스크롤하는 등의 작업을 수행하려는 경우 .h 파일에 포함시킬 수도 있습니다 .
viewDidLayoutSubviews
.
contentSize를 올바르게 설정 한 후에도보기를 스크롤 할 수 없으면 Interface Builder-> File Inspector에서 "AutoLayout 사용" 을 선택 취소 하십시오.
contentSize
스크롤보기가 제대로 스크롤 되려면 스크롤보기 의 속성 을 설정해야합니다 .
당신이 자동 레이아웃을 사용하는 경우 설정해야합니다 contentSize
에 viewDidLayoutSubviews
그것이 자동 레이아웃이 완료된 이후에 적용하기 위해.
코드는 다음과 같습니다.
-(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
을의 크기로 설정하더라도 contentView
scrollView와 contentView의 크기가 동일하게 설정된 것처럼 보이기 때문에 효과가있었습니다. 그러나 높이를 높이 contentSize
보다 큰 값으로 설정 contentView
하면 효과가 있습니다.
viewDidLayoutSubviews
수명주기 동안 여러 번 호출 될 수 있으므로 예상보다 높이가 커질 위험이 있습니다.
위의 답변은 정확합니다-스크롤을 발생 시키려면 내용 크기를 설정해야합니다.
인터페이스 빌더를 사용하는 경우이를 수행하는 깔끔한 방법은 사용자 정의 런타임 속성을 사용하는 것입니다. 예 :
콘텐츠 크기를 큰 숫자로 조정하십시오. 내용 크기가 제어 크기보다 큰 경우에도 스크롤보기가 스크롤되지 않는 이유를 이해할 수 없었습니다. 콘텐츠 크기가 필요한 것보다 작 으면 작동하지 않는다는 것을 알았습니다.
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000 대신에 큰 숫자를 입력 할 수 있습니다. 그리고 그것이 작동한다면, 크기를 조정할 때 콘텐츠 크기가 충분하지 않다는 것을 의미합니다.
스크롤보기가 작동하는 데 위임이 필요하지 않습니다.
스크롤보기의 contentSize 속성이 올바른 크기로 설정되어 있는지 확인하십시오 (예 : 모든 내용을 포함하기에 충분한 크기).
'자동 레이아웃 사용'을 선택 취소하면 나에게 속임수가 있습니다.
환경 : xCode 5.0.2 스토리 보드 ios7
세트 contentSize
의 특성 UIScrollview
에 ViewDidLayoutSubviews
방법. 이 같은
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
처음 시도 할 때 작동하게 만들었습니다. 자동 레이아웃 및 모든 기능으로 추가 코드가 없습니다. 그런 다음 컬렉션 뷰가 바나나로 이동하여 런타임에 충돌이 발생하여 잘못된 것을 찾을 수 없으므로 삭제하고 다시 만들었습니다 (Xcode 10 Beta 4를 사용하고 있습니다). 그런 다음 스크롤이 사라졌습니다. 그래도 컬렉션 뷰가 다시 작동했습니다!
몇 시간 후에 .. 이것이 나를 위해 고쳐 준 것입니다. 나는 다음과 같은 레이아웃을 가졌다.
UIView
그것은 모든 제약 조건에 있습니다. 안전 영역은 시스템에 의해 자동으로 정의됩니다. 최악의 경우 스크롤 및 내용보기에 대한 모든 제약 조건을 제거하고 IB를 재설정 / 생성 하지 마십시오 . 수동으로 만들면 작동합니다.
기본적으로 개념은 안전 영역에 맞는 내용보기에 맞는 스크롤보기를 갖는 것입니다.
그러나 그렇게 작동하지 않았습니다. 컨텐츠 뷰의 높이가 누락되었습니다. 내가 할 수있는 모든 것을 시도했지만 트릭을 수행하는 유일한 사람은 컨트롤 뷰 콘텐츠를 만든 콘텐츠 뷰 높이입니다 . 그것은 고정 높이를 정의했습니다.이 값은 뷰 컨트롤러의 크기 (실제 디스플레이보다 길고 모든 하위 뷰를 포함하는 자유 형식으로 정의 됨)에서 계산되어 마침내 다시 작동했습니다!
전에 언급되지 않은 것!
콘센트가 scrollView에 올바르게 연결되어 있는지 확인하십시오! 채워진 원이 있어야하지만 원을 채워도 scrollView가 연결되지 않았을 수 있으므로 다시 확인하십시오! 원 위로 마우스를 가져 가서 실제 스크롤보기가 강조 표시되는지 확인하십시오! (이것은 나를위한 사건이었다)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
튜토리얼을 따른 경우 코드가 올바른 시간이지만 많은 초보자가 모르는 것은 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)
}
이 코드는 위에서 말한 것을 수행하는 한 완벽하게 작동합니다.
다른 솔루션으로도 문제가 해결되지 않으면 실제로 스크롤보기가 UIScrollView
Interface Builder에 있는지 다시 확인하십시오 .
지난 며칠 동안 어느 시점에서 클래스 가 인스펙터에서 말했지만 내 UIScrollView
유형 이 자연스럽게로 변경되었습니다 . 을 사용하고 있습니다.UIView
UIScrollView
Xcode 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
Simulator/device->press
길게 눌러 app->click
제거그런 다음 앱을 빌드하고 실행할 수 있고 스크롤 기능을 다시 가질 수 있어야합니다.
추신 : 스크롤보기의 내용 크기를 설정 viewDidLayoutSubviews
하거나 자동 레이아웃을 해제 할 필요가 없었지만 YMMV.
귀하 scrollView
가 containerView
일부 유형 의 하위보기 인 경우 귀하 가 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는 볼 수 있지만 사용자 상호 작용은받지 않습니다.
를 추가 UIScrollViewDelegate
하고 다음 코드 추가하는 viewDidAppear
방법은 나를 위해 그것을 해결했습니다.
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
내 문제는 다음과 같이 해결되었습니다.
안전 영역 및 / 또는 수퍼 뷰에 바인딩 된 상단 및 / 또는 하단 구속 조건을 제거하면 scrollView 내부의 뷰가 다시 스크롤되어 화면 하단의 상단에 고정되지 않습니다!
희망은 이것이이 특정 문제로 다른 사람의 고통에서 멈추는 것을 희망합니다.
이 스레드에서 제공된 답변에 실패한 후 솔루션 으로이 기사 를 우연히 발견했습니다 .
자동 레이아웃으로 스크롤보기를 설정하는 데 직관적이지 않은 두 가지가 있습니다.
이것은 그 기사의 요지입니다. 그림을 포함한 자세한 설명을 확인하십시오.