나는 UIView
아이폰의 스프링 보드와 같다. UIScrollView
및을 사용하여 만들었습니다 UIButtons
. 스크롤 뷰에서 가로 스크롤을 비활성화하고 싶습니다. 세로 스크롤 만 원합니다. 어떻게해야합니까?
나는 UIView
아이폰의 스프링 보드와 같다. UIScrollView
및을 사용하여 만들었습니다 UIButtons
. 스크롤 뷰에서 가로 스크롤을 비활성화하고 싶습니다. 세로 스크롤 만 원합니다. 어떻게해야합니까?
답변:
의 contentSize
속성 을 설정해야 합니다 UIScrollView
. 예를 들어 UIScrollView
너비가 320 픽셀 (화면 너비)이면 다음을 수행 할 수 있습니다.
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
그러면 UIScrollView
이미 모든 것을 가로로 표시 할 수 있으므로 세로로만 스크롤됩니다.
업데이트 : (@EranMarom이 자신의 의견에 대해 지적한 후)
방법 에서 가로 스크롤 또는 세로 스크롤 을 중지 할 수 있습니다 ScrollViewDelegate
. 방법은 다음과 같습니다.
수평 스크롤을 중지합니다.
가로로 스크롤하려면 contentOffset.x를 늘려야합니다. 가로 방향으로 스크롤 뷰 스크롤이 중지되는 것을 방지합니다.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
수직 스크롤을 중지합니다.
수직으로 스크롤하려면 contentOffset.y를 늘려야합니다. 스크롤 뷰 스크롤을 세로 방향으로 중지하는 것을 방지합니다.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
위의 코드는 x
및 y
의 변경을 방지하고 메서드 scrollview contentOffset
에서 스크롤링을 중지합니다 scrollViewDidScroll:
.
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
가로 스크롤을 비활성화합니다. 더 읽기 쉽고, 더 작으며, 드물게 실행되는 코드 (즉, 초당 최대 수십 번)에 대한 오버 헤드가 거의 없기 때문에 0에 대한 테스트를 수행 할 필요가 없습니다.
scrollView.contentOffset.y = 0.0
세로 스크롤 scrollView.contentOffset.x = 0.0
을 중지하고 가로 스크롤을 중지 하는 데 사용 scrollViewDidScroll()
합니다. 그러나 나는 scrollView.contentSize
같음 을 확인 scrollView.frame.size
하는 것이 더 나은 (올바른) 해결책 이라고 믿습니다 . @danbeaulieu 답변을 참조하십시오.
iOS7 사용 이후
self.automaticallyAdjustsScrollViewInsets = NO;
// 3 페이지로 페이지 스크롤러를 만듭니다.
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
부드러운 스크롤 (드래그가 아닌)로 문제를 해결하는 데 도움이되었습니다. 문제는 메서드에 scrollViewWillEndDragging:
있었습니다. targetContentOffset은 scrollView.contentOffset과 동일하며 페이지 감지 로직이 제대로 작동하지 않습니다.
신속한 솔루션
보기 용과 스크롤보기 용으로 하나씩 두 개의 콘센트를 만듭니다.
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
그런 다음 viewDidLayoutSubviews에서 다음 코드를 추가 할 수 있습니다.
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
우리가 한 것은 뷰의 높이와 너비를 수집하고 그에 맞게 scrollViews 콘텐츠 크기를 설정하는 것입니다. 그러면 스크롤 뷰가 가로로 스크롤되지 않습니다.
더 많은 생각 :
CGSizeMake는 CGFloats를 사용하여 너비와 높이를 취합니다. 두 번째 매개 변수에 UIScrollViews 기존 높이를 사용해야 할 수도 있습니다. 다음과 같이 표시됩니다.
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
iOS 11에 도입 된 새로운 속성은 UIScrollView
var contentLayoutGuide: UILayoutGuide
문서에는 다음 사항이 명시되어 있습니다.
스크롤보기의 콘텐츠 영역과 관련된 자동 레이아웃 제한을 만들려면이 레이아웃 가이드를 사용하십시오.
당신이 제한하기를 원할 것입니다 추가 될 수 있음을 다른 자동 레이아웃 제약과 함께 widthAnchor
의 UIScrollView
의를 contentLayoutGuide
"프레임"과 같은 크기로. 당신은 사용할 수 있습니다 frameLayoutGuide
(또한 아이폰 OS (11)에 도입) 또는 외부 폭 (예를로superView
의.)
예:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
문서 : https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
이 한 줄을 사용하십시오.
self.automaticallyAdjustsScrollViewInsets = NO;