programing

UIScrollView에서 수직 스크롤 비활성화

closeapi 2023. 8. 29. 20:38
반응형

UIScrollView에서 수직 스크롤 비활성화

스크롤 뷰에서 세로 스크롤을 선택 취소하는 옵션이 IB에 있지만 작동하지 않는 것 같습니다.

스크롤 뷰를 IB가 아닌 코드에서 수직으로 스크롤하지 않고 수평으로만 스크롤하도록 설정하려면 어떻게 해야 합니까?

iOS7 이후:

첫 번째: 내용 크기 너비는 스크롤 보기의 너비와 같아야 합니다.

두 번째: initWithNibName에서:

self.automaticallyAdjustsScrollViewInsets = NO;

바로 그거야.

contentSize의 높이를 scrollView의 높이로 설정해 보십시오.그러면 세로 스크롤을 사용할 수 없게 되므로 세로 스크롤을 사용할 수 없습니다.

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

네, pt2ph8의 대답이 맞습니다.

그러나 어떤 이상한 이유로 contentSize가 UIScrollView보다 커야 하는 경우, UIScrollView 프로토콜 방법을 구현하는 수직 스크롤을 비활성화할 수 있습니다.

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

UIView 컨트롤러에 추가하기만 하면 됩니다.

float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

이것은 사용자가 UIScrollView를 스크롤할 때 호출되는 방법이며, 그렇게 하면 항상 동일한 .y를 사용하도록 강제합니다.

다음 방법 포함

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

스크롤 보기의 내용 크기 너비를 스크롤 보기의 너비와 동일하게 설정합니다.

원하는 방향으로 사용하지 않으려면 내용 크기에서 0을 전달해야 합니다.

수직 스크롤을 비활성화하려면

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

수평 스크롤을 비활성화하려면

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

수직 스크롤을 사용할 수 없도록 콘텐츠 크기를 업데이트했는데 스크롤 기능은 그대로 남아 있습니다.그리고 저는 스크롤을 완전히 비활성화하기 위해 수직 바운스도 비활성화해야 한다는 것을 알게 되었습니다.

아마도 이 문제를 가진 사람들도 있을 것입니다.

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

당신은 확인했을 것입니다.UIScrollViewDelegate

aScrollView.delegate = self;

항상 맨 위에 있도록 설정합니다.UIScrollViewDelegate를 준수해야 합니다.

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

이렇게 하면 스크롤의 감속/가속 효과가 유지됩니다.

iOS 11에서는 안전한 영역이 아닌 화면 경계에 따라 스크롤 보기를 만드는 데 관심이 있다면 다음을 추가하는 것을 잊지 마십시오.

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

많은 답변에는 다음과 같은 설정이 포함됩니다.contentOffset0. ScrollView 내부의 뷰를 중심에 두고 싶은 경우가 있었습니다.이것은 저에게 도움이 되었습니다.

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}

iOS11에서 다음 속성을 사용할 수 있습니다.

let frameLayoutGuide: UILayoutGuide

frameLayoutGuide.to 앵커 및 frameLayoutGuide.bottom에 대한 제약 조건을 설정한 경우스크롤의 일부 하위 뷰에 동일한 앵커를 고정하면 수직 스크롤이 비활성화되고 스크롤 뷰의 높이가 하위 뷰의 높이와 같습니다.

가장 확실한 해결책은 하위 클래스의 변경을 금지하는 것입니다.

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

이 솔루션은 다음과 같은 경우에만 적합합니다.

  1. 허용되지 않거나 대리인을 사용하지 않습니다.
  2. 내용물 높이가 컨테이너 높이보다 큽니다.

넌 할 수 있을 것 같아.

  1. directionalLockEnabled를 true로 설정
  2. contentView의 너비를 superView의 너비와 동일하게 설정합니다.

그러면 되겠군요.

언급URL : https://stackoverflow.com/questions/5095713/disabling-vertical-scrolling-in-uiscrollview

반응형