UIScrollView가 스크롤되지 않음
나는 있습니다UIScrollView
은것을포는을 .UIImageView
UI 등s, UI 이블등...이 라은훨더깁니다씬벨▁the다▁that보다 훨씬 .UIScrollView
앱을 실행하면 아래로 스크롤할 수 없습니다.
왜 그럴까요?
감사해요.
전체 작업 코드 조각을 표시하는 것이 좋습니다.
// 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
. . . .
contentSize를 올바르게 설정한 후에도 보기를 스크롤할 수 없는 경우, Interface Builder -> File Inspector에서 "Use 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
);
}
위의 답변은 정답입니다. 스크롤을 수행하려면 내용 크기를 설정해야 합니다.
인터페이스 작성기를 사용하는 경우 사용자 정의 런타임 속성을 사용하는 것이 좋습니다.예:
콘텐츠 크기를 큰 숫자로 조정해 보십시오.콘텐츠 크기가 컨트롤 크기보다 큰 것 같은데 스크롤 보기가 스크롤되지 않는 이유를 이해할 수 없었습니다.콘텐츠 크기가 필요한 것보다 작으면 역시 작동하지 않는다는 것을 알게 되었습니다.
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000년 대신에 여러분은 여러분만의 큰 숫자를 넣을 수 있습니다.그리고 이 기능이 작동하면 크기를 조정할 때 콘텐츠 크기가 충분히 크지 않다는 것을 의미합니다.
위임자는 스크롤 뷰가 작동하는 데 필요하지 않습니다.
스크롤 보기의 contentSize 속성이 올바른 크기(즉, 모든 콘텐츠를 포함할 수 있을 정도로 큰 것)로 설정되어 있는지 확인합니다.
'자동 레이아웃 사용' 선택을 취소하면 유용합니다.
환경: xCode 5.0.2 스토리보드 ios7
내 경우에는 설정해야 했습니다.delaysContentTouches
입니다. 는 모두 이기 때문입니다. ScrollView 내부의 객체는 모두 터치 이벤트를 캡처하고 직접 처리하는 것이 아니라 ScrollView 자체에서 처리하기 때문입니다.
트contentSize
의 UIScrollview
ViewDidLayoutSubviews
방법. 이거 같은 .
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
가 (IOS8 / swift)viewDidLayoutSubviews
존재하지 . 대신 과 같이 하십시오. 대신 다음을 사용하십시오.
override func viewDidAppear(animated: Bool)
이것이 나를 위해 해결했습니다.
스크롤할 내용 크기를 스크롤 보기 크기보다 작게 설정했기 때문에 스크롤 보기가 스크롤되지 않는 이유에 대한 아이디어는 잘못된 것입니다.스크롤하는 동안 내용을 탐색하려면 내용 크기를 스크롤 보기 크기보다 크게 설정해야 합니다.
확대/축소와 동일한 개념으로 확대/축소 작업을 통해 적용할 확대/축소의 최소값과 최대값을 설정합니다.
환영합니다 :)
위의 한 가지 작은 추가 사항은 스크롤 뷰가 스크롤되지 않는 실제 이유입니다. 그러나 때때로 이것은 특히 스크롤 뷰가 IB가 아닌 코드를 통해 추가될 때 하위 뷰를 상위 뷰에 추가했을 수 있으며 스크롤 뷰가 아닌 하위 뷰가 스크롤되지 않는 원인은 서브뷰가 스크롤되지 않도록 합니다.
컨텐츠 크기를 설정하고 상위 보기 프레임보다 크게 유지합니다(duhh!).
저는 첫 번째 시도에서 성공했습니다.자동 레이아웃과 모든 기능을 갖추고 있으며 추가 코드는 없습니다.그리고 나서 컬렉션 뷰가 바나나가 되어 런타임에 충돌했고, 무엇이 잘못되었는지 찾을 수 없어서 삭제하고 다시 만들었습니다(Xcode 10 베타 4를 사용하고 있습니다).벌레처럼 느껴졌고, 스크롤이 사라졌습니다.컬렉션 보기가 다시 작동했습니다!
몇시간 후에..이것이 저를 위해 그것을 고친 것입니다.다음과 같은 레이아웃이 있었습니다.
유뷰
- 안전 영역
- 스크롤 뷰
- 콘텐츠 보기
모든 것이 제약 속에 있습니다.안전 영역은 시스템에 의해 자동으로 정의됩니다.최악의 경우 스크롤 및 콘텐츠 보기에 대한 모든 제약 조건을 제거하고 IB가 이를 재설정/생성하지 않습니다.수동으로 만들면 효과가 있습니다.
- 스크롤 보기의 경우: 후행/위쪽을 안전한 영역에 정렬합니다. 너비/높이가 안전한 영역과 같음.
- 내용 보기의 경우: 후행/선행/위쪽/아래쪽을 수퍼뷰에 정렬(스크롤 보기).
기본적으로 컨텐츠 보기가 스크롤 보기에 적합하도록 하는 개념으로, 안전 영역에 적합합니다.
하지만 그것은 효과가 없었습니다.콘텐츠 보기가 높이를 벗어났습니다.저는 할 수 있는 모든 것을 시도했고, 그 속임수를 쓰는 유일한 방법은 콘텐츠 보기 높이를 생성하여 컨트롤을 끄는 콘텐츠 보기였습니다. 그 자체적으로고정 높이를 정의했습니다. 이 값은 뷰 컨트롤러의 크기(실제 디스플레이보다 긴 자유 형식으로 정의되어 모든 하위 뷰가 포함됨)에서 계산되었고 마침내 다시 작동했습니다!
추가합니다.UIScrollViewDelegate
를 리고다코추니다합에 합니다.viewDidAppear
방법이 나를 위해 그것을 고쳤습니다.
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
문제 해결 방법:
- 내용 설정스크롤의 크기큰 높이로 보기
- 또한 ScrollView 내의 보기에 대한 상단 및/또는 하단 제약 조건을 수정해야 했습니다. 즉, 화면에 스크롤 표시기가 표시되지만 내용은 스크롤되지 않았습니다.
안전 영역 및/또는 수퍼뷰에 바인딩된 상단 및/또는 하단 제약 조건을 제거하면 스크롤 뷰 내부의 보기가 다시 스크롤될 수 있으며 화면 맨 위에 고정되어 있지 않습니다.
이것이 이 특정 문제로 인해 다른 누군가가 몇 시간 동안 고통받는 것을 멈추기를 바랍니다.
또 다른 재미있는 경우:
스크롤 뷰superview.userInteractionEnabled는 true여야 합니다.
부모가 UIImageView이고 당연히 사용자가 있다는 것을 알기 위해 2시간 이상 이것을 쫓아다녔습니다.InteractionEnabled == false
전에 언급되지 않은 것!
콘센트가 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
인터페이스 작성기에서.
사이 , 제 지난며칠어시느서점에의나, 의간▁at▁my,나서의에점시▁in▁some,▁last▁point▁few.UIScrollView
자발적으로 a로 변경된 유형UIView
이 에서말한바같와이반같이▁said▁its라고 했지만.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
- iOS
Simulator/device->press
그리고 들고 있어요.app->click
그것을 (는 것을제기한위하 (X)
그러면 앱을 빌드하고 실행할 수 있으며 스크롤 기능을 다시 사용할 수 있습니다.
뷰의 를 신추: 스롤보콘크텐설기필없정다었니습요가할를츠기의로 설정할 viewDidLayoutSubviews
YMMV는 YMMV로 설정됩니다.
만약 당신이scrollView
는 의하개니다입의 입니다.containerView
에는, 당신의 어떤유의, 면다의, 신당그를 하세요.scrollView
는 의프 의 틀 범위 .containerView
나는 가지고 있었습니다containerView.clipsToBounds = NO
를 볼 수 , 여히스볼를수있해게만줬, 왜하면냐지.scrollView
의 범위 내에 있지 않았습니다.containerView
터치 이벤트를 감지하지 못할 것입니다.
예:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
스크롤 보기를 볼 수 있지만 사용자 상호 작용은 수신하지 않습니다.
다코드추에 다음 viewDidLayoutSubviews
을 시도한 에:모든 답을 시도한 후:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
간단한 프로그래밍 방식
마무리하기
성을 합니다.UIScrollView
private lazy var scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
return scrollView
}()
단일 하위 보기를 사용하여 모든 내용 하위 보기 보유
private lazy var contentView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
보기 추가
contentView.addSubview(firstSubView)
contentView.addSubview(lastSubView)
scrollView.addSubview(contentView)
view.addSubview(scrollView)
일반적으로 콘텐츠를 한 방향으로만 스크롤합니다.대부분의 경우 수직으로 스크롤합니다.따라서 내용 보기의 너비를 스크롤 보기의 너비로 설정합니다.
NSLayoutConstraint.activate([
contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
단일 콘텐츠 보기에서 스크롤 보기로 네 가지 제약 조건(위, 아래, 왼쪽, 오른쪽)을 부착합니다.
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
내용 보기의 네 면 모두에 구속조건이 부착되어 있는지 확인하여 내용 보기가 내용 크기로 확장되도록 합니다.
// After Adding your subviews to the contentView make sure you've those two constraints set:
firstSubView.topAnchor.constraint(equalTo: contentView.topAnchor),
.
.
.
lastSubView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])
참조:iOS에서 자동 레이아웃과 함께 UIScrollView 사용
이 스레드에서 제공된 답변에 실패한 후, 저는 솔루션이 포함된 이 기사를 우연히 발견했습니다.
자동 레이아웃을 사용하여 스크롤 보기를 설정할 때 직관적이지 않은 두 가지 사항이 있습니다.
- 내용 보기와 스크롤 보기 사이의 여백으로 설정한 제약 조건은 내용 보기의 크기에 영향을 주지 않습니다.그것들은 정말 마진입니다.그리고 그것이 작동하기 위해서는 콘텐츠 보기의 크기가 고정되어 있어야 합니다.
- 고정 크기의 비결은 내용 보기의 너비를 스크롤 보기의 상위 너비와 동일하게 설정할 수 있다는 것입니다.왼쪽 트리에서 두 뷰를 모두 선택하고 동일한 너비 제약 조건을 추가하기만 하면 됩니다.
이것이 그 기사의 요지입니다.그림을 포함한 자세한 설명은 여기를 참조하십시오.
이 자동 레이아웃 문제로...내가 그냥 만든다면,ViewController
사용하다UIView
에 UIScrollView
수업을 위해...그러면 그냥 a를 추가하세요.UIScrollView
있다는 을.효과가 있다는 것.
저도 IB에서 같은 문제가 있었습니다.
스크롤 뷰의 선행, 후행, 상단 및 하단을 superView로 설정한 후컨테이너 View를 스크롤할 수 있도록 다음과 같이 변경하여 작동했습니다.
ScrollView를 수평 방향으로만 스크롤하려면 scrollView의 중심 Y = ContainerView의 중심으로 제약 조건을 설정합니다.y
스크롤 보기의 중심 X = ContainerView의 중심 X를 수직으로 스크롤할 수 있도록 합니다.
스크롤 보기의 내용 크기를 설정할 필요가 없습니다.
누군가 저와 같은 실수를 저질렀을 경우를 대비해서 제 사례를 공유하고 싶습니다.
제 경우, 스크롤 뷰의 하위 뷰 중 하나에 실수로 제약 조건을 추가하여 상위 레이아웃 가이드에 대한 하위 뷰의 공간을 고정하여 위치를 변경할 수 없어 스크롤 뷰를 스크롤할 수 없습니다.
언급URL : https://stackoverflow.com/questions/2824435/uiscrollview-not-scrolling
'programing' 카테고리의 다른 글
앱이 앱스토어에 없는 경우 Firebase Dynamic Links를 테스트하려면 어떻게 해야 합니까? (0) | 2023.06.25 |
---|---|
VBA에서 셀 또는 범위만 재계산할 수 있습니까? (0) | 2023.06.25 |
Float Firebase 코어 플러그인.java는 더 이상 사용되지 않는 API를 사용하거나 재정의합니다. (0) | 2023.06.25 |
R에서 변수 이름을 지정할 때 선호하는 스타일은 무엇입니까? (0) | 2023.06.25 |
WHERE 콜인(...) 조건에 대한 제한 (0) | 2023.06.25 |