programing

UIScroll View를 가져와 맨 위로 스크롤합니다.

skycolor 2023. 4. 17. 21:37
반응형

UIScroll View를 가져와 맨 위로 스크롤합니다.

UIScroll View를 맨 위로 스크롤하려면 어떻게 해야 합니까?

iOS 7용 업데이트

[self.scrollView setContentOffset:
    CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

원래의

[self.scrollView setContentOffset:CGPointZero animated:YES];

또는 수평 스크롤 위치를 유지하고 수직 위치만 재설정하려면 다음과 같이 하십시오.

[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
    animated:YES];

Swift 확장 기능을 사용하면 다음과 같이 쉽게 사용할 수 있습니다.

extension UIScrollView {
    func scrollToTop() {
        let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
        setContentOffset(desiredOffset, animated: true)
   }
}

사용방법:

myScrollView.scrollToTop()

Swift 4의 경우

scrollView.setContentOffset(.zero, animated: true)

iOS 11 이상

새로운 것을 만지작거려 하다adjustedContentInset (또,prefersLargeTitles,safe area등)

예를 들어(맨 위로 스크롤):

var offset = CGPoint(
    x: -scrollView.contentInset.left, 
    y: -scrollView.contentInset.top)

if #available(iOS 11.0, *) {
    offset = CGPoint(
        x: -scrollView.adjustedContentInset.left, 
        y: -scrollView.adjustedContentInset.top)    
}

scrollView.setContentOffset(offset, animated: true)

사용하다setContentOffset:animated:

[scrollView setContentOffset:CGPointZero animated:YES];

Swift 2.0/3.0/4.0 및 iOS 7+에 대한 답변:

let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top)
self.scrollView.setContentOffset(desiredOffset, animated: true)

iOS7에서는 iOS6에서 동작하는 특정 스크롤뷰를 맨 위로 이동시키는 데 문제가 있어 스크롤뷰를 맨 위로 이동시키는 데 사용했습니다.

[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

SWIFT 5에서 내용 오프셋을 0으로 설정합니다.

scrollView.setContentOffset(CGPoint.zero, animated: true)

Swift 3.0.1 버전의 rob mayoff 답변:

self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)

iOS 11 및 이전 버전(수직 스크롤용)과 완전히 호환되는 답변이 있다고 생각합니다.

여기에는 새로운 adjusted Content가 고려됩니다.기본값이 무엇이든 간에 추가 52px 오프셋이 필요한 것으로 보이는 네비게이션바에서 prefer LargeTitles가 활성화되어 있을 때 필요한 추가 오프셋을 삽입하고 설명합니다.

이것은 조금 까다로웠습니다.왜냐하면 adjusted Content가삽입은 titleBar 상태(큰 제목과 작은 제목)에 따라 달라지기 때문에 titleBar 높이를 확인하고 52px 오프셋이 이미 큰 상태일 경우 적용하지 않아야 했습니다.네비게이션 바의 상태를 체크하는 다른 방법을 찾을 수 없었습니다.그래서 높이가 44.0 이상인지 확인하는 것보다 더 좋은 옵션이 있다면 듣고 싶습니다.

func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
    if #available(iOS 11.0, *) {
        let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
        let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
        let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
        scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
    } else {
        scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
    }
}

Jakub의 솔루션에서 영감을 얻은

는 탐색 막대가 스크롤 보기 컨텐츠의 작은 부분과 겹쳐서 컨텐츠가 위에서부터 시작되지 않는 것처럼 보이는 경우 매우 일반적입니다.수리를 위해 두 가지 작업을 수행했습니다.

  • [ Size Inspector ]- [ Scroll View ]- [ Content Insets ]-> [ Automatic ]에서 [Never]변경합니다.
  • Size Inspector - 구속조건 - "Align Top" (상단 정렬 구속조건)- 두 번째 항목 --> 슈퍼뷰에서 변경.맨 위는 안전 구역입니다.맨 위 및 값(상수 필드)이 0으로 설정됨

콘텐츠 삽입 - 없음 Scrol View를 정렬합니다.

상태 표시줄의 스크롤 투 탑 동작을 완전히 복제하려면 contentOffset을 설정해야 할 뿐만 아니라 스크롤인디케이터가 표시되는지 확인해야 합니다.그렇지 않으면 사용자가 빠르게 길을 잃을 수 있습니다.

하기 위한 유일한 은 " " 입니다.flashScrollIndicators아쉽게도 contentOffset 설정 후 한 번 호출해도 즉시 리셋되므로 효과가 없습니다.할 때 을 알게 .scrollViewDidScroll:.

// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291

- (void)scrollContentToTop {
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];

    self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.scrollView.tag = 0;
    });
}

UIScrollViewDelegate(또는 UITable/UICollectionViewDelegate)에서 다음을 수행합니다.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
        [scrollView flashScrollIndicators];
    }
}

숨김 지연은 상태 표시줄 스크롤 ToTop 동작에 비해 조금 짧지만 여전히 양호합니다.

뷰 태그를 사용하여 "isScrollingToTop" 상태를 전달하고 있습니다. 뷰 태그는 뷰 컨트롤러 간에 필요합니다.태그를 다른 용도로 사용하는 경우 iVar 또는 속성으로 대체할 수 있습니다.

뷰의 합니다.adjustedContentInset:

let point = CGPoint(x: -scrollView.adjustedContentInset.left,
                    y: -scrollView.adjustedContentInset.top)
    
scrollView.setContentOffset(point, animated: true)

iOS 16

테이블 및 컬렉션 뷰의 경우 항상 다음 사항이 적용됩니다.

let top = CGRect(x: 0, y: 0, width: 1, height: 1)
tableView.scrollRectToVisible(top, animated: true)
collectionView.scrollRectToVisible(top, animated: true)

스크롤 뷰의 경우:

let top = CGPoint(x: 0, y: -adjustedContentInset.top)
scrollView.setContentOffset(top, animated: animated)

adjustedContentInset는, 세이프 에리어(있는 경우)에 의해서 적용되는 인스톨과 인스턴스화 후에 적용되는 커스텀인스톨을 반환합니다. custom 중 맨 0이 음이 이.safe custom inset custom inset을 .이 때문에 이 속성을 사용해야 합니다.

다음 시간 동안 맨 위로 스크롤:UITableViewController,UICollectionViewController 임의의 「」를 참조해 주세요.UIViewController 있다UIScrollView

extension UIViewController {

  func scrollToTop(animated: Bool) {
    if let tv = self as? UITableViewController {
        tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
    } else if let cv = self as? UICollectionViewController{
        cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
    } else {
        for v in view.subviews {
            if let sv = v as? UIScrollView {
                sv.setContentOffset(CGPoint.zero, animated: animated)
            }
        }
    }
  }
}

iOS 2.0+Mac Catalyst 13.0+

도 한번 해보세요.scrollView.scrollsToTop = true

developer.apple.com 의 메뉴얼로부터 참조할 수 있습니다.

나는 모든 방법을 다 써봤다.하지만 난 아무 것도 안 통했어.드디어 이렇게 했어요.

는 ㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.self.view .addSubview(self.scroll)view Did Load 。스크롤 뷰용 프레임 설정을 시작하고 스크롤 뷰에 컴포넌트를 추가했습니다.

그것은 나에게 효과가 있었다.

넣으세요.self.view .addSubview(self.scroll)UI 요소를 추가할 수 .UI를 사용합니다.

언급URL : https://stackoverflow.com/questions/9450302/get-uiscrollview-to-scroll-to-the-top

반응형