UIScrollView의 가로 스크롤을 비활성화하는 방법은 무엇입니까?


92

나는 UIView아이폰의 스프링 보드와 같다. UIScrollView및을 사용하여 만들었습니다 UIButtons. 스크롤 뷰에서 가로 스크롤을 비활성화하고 싶습니다. 세로 스크롤 만 원합니다. 어떻게해야합니까?


5
제목을 변경해야합니다. 질문에 가로를, 제목에 세로를 요청합니다. 여전히 :) 나중에 2 년 중요한 그래서 사람들은 검색 엔진에 나중에 질문을 찾을
줄리앙

@RahulVyas 위의 남자는 요점이 있습니다. 제목을 변경하면 검색 엔진 (예 : 나;))을 통해 여기에 오는 초보자의 혼동을 줄일 수 있습니다.
SpacyRicochet 2011 년

포스터를 대신하여 제목을 편집했습니다. (현재 편집이 표시되기 전에 동료 검토를 기다리고 있습니다.)
Duncan Babbage 2011 년

답변:


125

contentSize속성 을 설정해야 합니다 UIScrollView. 예를 들어 UIScrollView너비가 320 픽셀 (화면 너비)이면 다음을 수행 할 수 있습니다.

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];

그러면 UIScrollView이미 모든 것을 가로로 표시 할 수 있으므로 세로로만 스크롤됩니다.


6
안녕하세요. 이 솔루션은 정말 잘 작동합니다! 감사합니다. 정적 너비를 0으로 설정해 보았습니다. 저에게도 이것도 작동합니다. 나중에 부작용이 있을지 모르겠습니다. 그러나 크기 (예 : iPhone 및 iPad 용 범용 코드)를 모르는 경우에는 훌륭하게 작동합니다!
JackPearse 2011

5
나는 CGSizeMake (0, myScrollableHeight)를 수행하는 것이 더 낫다고 생각하므로 모든 하위보기가 표시되지 않더라도 수평 스크롤이 비활성화됩니다.
LightNight 2013-08-29

NB 페이징을 사용할 때 차원 중 하나를 0으로 설정하면 VoiceOver가 올바른 값에 관계없이 페이지 번호를 "
1/1

1
너비를 320 하드 코드로 전달하는 대신 다음과 같이 전달할 수 있습니다. CGSize scrollableSize = CGSizeMake (self.scrollview.frame.size.width, myScrollableHeight); [myScrollView setContentSize : scrollableSize];
Mohit 쿠마

90

업데이트 : (@EranMarom이 자신의 의견에 대해 지적한 후)

방법 에서 가로 스크롤 또는 세로 스크롤중지 할 수 있습니다 ScrollViewDelegate. 방법은 다음과 같습니다.

수평 스크롤을 중지합니다.

가로로 스크롤하려면 contentOffset.x를 늘려야합니다. 가로 방향으로 스크롤 뷰 스크롤이 중지되는 것을 방지합니다.

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.x = 0.0
}

수직 스크롤을 중지합니다.

수직으로 스크롤하려면 contentOffset.y를 늘려야합니다. 스크롤 뷰 스크롤을 세로 방향으로 중지하는 것을 방지합니다.

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.y = 0.0
}

위의 코드는 xy의 변경을 방지하고 메서드 scrollview contentOffset에서 스크롤링을 중지합니다 scrollViewDidScroll:.


1
이 답변은 방금 코드를 제공 한 자체를 설명하지 않기 때문에 반대 투표를 고려하고 있습니다. 그다지 좋지 않은 답변입니다. 좋은 대답은 스스로를 설명하지만 숙련 된 개발자는이 새로운 개발자가 여기서 무슨 일이 일어나고 있는지 이해하지 못할 수도 있음을 이해할 수 있습니다. 개선 할 수있는 기회를주는 것으로 아직 비추천하지 않았습니다.
Popeye

13
이것은 일종의 해킹이지만 다른 모든 것이 실패했을 때 작동했습니다. 따라서 +1하지만 최후의 수단으로 만 사용하십시오.
i_am_jorf 2014

5
이 델리게이트 메서드도 사용하지만 본문을 한 줄로 바꿉니다. 예를 들어 scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);가로 스크롤을 비활성화합니다. 더 읽기 쉽고, 더 작으며, 드물게 실행되는 코드 (즉, 초당 최대 수십 번)에 대한 오버 헤드가 거의 없기 때문에 0에 대한 테스트를 수행 할 필요가 없습니다.
Echelon 2014 년

당신이하지 같은 'willscroll'전에 "didscroll"후 contentOffset을 변경하고,이 망치 솔루션입니다,하지만 난 나 자신은 downvote 때문에 18 upvotes을하지 않았다 그것은 downvote에 합당하지 그래서 대답은 75이기 때문에
LolaRun 2014 dec.

2
더 쉽게 델리게이트 기능 에서 scrollView.contentOffset.y = 0.0세로 스크롤 scrollView.contentOffset.x = 0.0을 중지하고 가로 스크롤을 중지 하는 데 사용 scrollViewDidScroll()합니다. 그러나 나는 scrollView.contentSize같음 을 확인 scrollView.frame.size하는 것이 더 나은 (올바른) 해결책 이라고 믿습니다 . @danbeaulieu 답변을 참조하십시오.
emem

11

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];

나는 이것이 scrollview의 스크롤 동작을 비활성화한다고 생각하지 않습니다. 맞나요 ??
Dinesh Raja 2014

self.collectionView.pagingEnabled = YES;부드러운 스크롤 (드래그가 아닌)로 문제를 해결하는 데 도움이되었습니다. 문제는 메서드에 scrollViewWillEndDragging:있었습니다. targetContentOffset은 scrollView.contentOffset과 동일하며 페이지 감지 로직이 제대로 작동하지 않습니다.
시그

11

신속한 솔루션

보기 용과 스크롤보기 용으로 하나씩 두 개의 콘센트를 만듭니다.

@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)

높이나 너비를 모르는 경우 (범용 장치)? @danbeaulieu
Lukesivi

@lukesIvi "myView.frame.width"는 "myView"IBOutlet에서 너비를 동적으로 가져옵니다.
Dan Beaulieu

4

제 경우에는 Swift로 4.2를 사용하여 다음을 사용할 수 있습니다.

수직 스크롤 비활성화 :

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}

수평 스크롤 비활성화 :

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0.0
}

3

보기를 선택한 다음에서 Attributes Inspector선택을 취소 할 수 있습니다 User Interaction Enabled.


3

제 경우에는 contentView의 너비가 UIScrollView의 너비보다 컸고 이것이 원치 않는 수평 스크롤의 이유였습니다. contentView의 너비를 UIScrollView의 너비와 동일하게 설정하여 해결했습니다.

누군가에게 도움이되기를 바랍니다.


@Nostradamus의 행복 도움에
걸펌 칸

0

viewDidLoad (아래와 같이)에 tableview contentInset이 설정되어 수평 스크롤의 원인이되었습니다.

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);

다른 이유로 설정된 tableview contentInset이 있는지 확인하고 비활성화하십시오.


0

나는 이것과 다른 스레드의 다양한 제안을 실패로 시도하면서 얼마 동안 이것으로 어려움을 겪었습니다.

그러나 다른 스레드 (어디에서 확실하지 않음)에서 누군가가 UIScrollView에 부정적인 제약 조건을 사용하는 것이 효과적이라고 제안했습니다.

그래서 저는 일관성없는 결과를 가진 다양한 제약 조합을 시도했습니다. 결국 나를 위해 일한 것은 스크롤 뷰에 -32의 선행 및 후행 제약 조건을 추가하고 너비가 320 (및 가운데) 인 (보이지 않는) 텍스트 뷰를 추가하는 것이 었습니다.


0

이 시도:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];

0

contentOffset하위 클래스의 속성 을 재정 의하여 가로 스크롤을 비활성화합니다 .

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: 0, y: newValue.y)
  }
}

0

iOS 11에 도입 된 새로운 속성은 UIScrollView

var contentLayoutGuide: UILayoutGuide

문서에는 다음 사항이 명시되어 있습니다.

스크롤보기의 콘텐츠 영역과 관련된 자동 레이아웃 제한을 만들려면이 레이아웃 가이드를 사용하십시오.

당신이 제한하기를 원할 것입니다 추가 될 수 있음을 다른 자동 레이아웃 제약과 함께 widthAnchorUIScrollView의를 contentLayoutGuide"프레임"과 같은 크기로. 당신은 사용할 수 있습니다 frameLayoutGuide(또한 아이폰 OS (11)에 도입) 또는 외부 폭 (예를로superView 의.)

예:

NSLayoutConstraint.activate([
  scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])

문서 : https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide


-1

UIScrollView를 하나의 셀만있는 UITableView로 바꾸면 정상적으로 작동했습니다.


1
죄송합니다. 질문에 대한 답변이 아닙니다.
David

-1

이 한 줄을 사용하십시오.

self.automaticallyAdjustsScrollViewInsets = NO;

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