Nice programing

상태 표시 줄을 눌러 UITableView 맨 위로 스크롤합니다.

nicepro 2020. 12. 13. 11:07
반응형

상태 표시 줄을 눌러 UITableView 맨 위로 스크롤합니다.


테이블 뷰를 맨 위로 스크롤하는 코드가 많이 있다는 것을 알고 있지만 Apple의 기본 앱에서와 같이 상단 상태 표시 줄을 탭할 때이 작업을 수행하고 싶습니다. 이것이 가능한가?


무료로받을 수 있지만 귀하의 scrollsToTop속성 UITableView이 YES 인지 확인해야합니다 .

이것이 작동하지 않는 경우 UIScrollView(또는 UITextView와 같은 하위 클래스) 객체가 다른 UIScrollView클래스 (예 :)에 포함되어 있을 때 UITableView입니다. 이 경우 scrollsToTop임베디드 UIScrollView클래스를 NO로 설정하십시오. 그러면 상태 표시 줄 누르기 동작이 작동합니다.


Google에서 왔으며 완전한 체크리스트가 필요한 경우 :

  1. UITableView에서 scrollsToTop = YES (Mark의 제안에 따라)를 설정했는지 확인하십시오.
  2. 창의 다른 모든 UITableViews / UIScrollViews / UITextViews에서 scrollsToTop = NO를 설정하여 클릭을 가로 채지 않도록합니다. 나는 이것을 디버그하기 위해 내 창에서 모든 뷰를 여러 번 인쇄하는 것을 발견했습니다 ...
  3. 테이블 뷰가 창 내에서 0/0 (x / y 좌표)에 있는지 확인합니다. 이것이 시스템이 메시지를 전달해야한다는 것을 인식하는 방법입니다.

다른 답변에 제공된 정보를 사용하여 UITableViewController에 다음 코드를 추가하여 작동하도록했습니다.

-(무효) viewDidLoad
{
    [super viewDidLoad];

    for (UITextView * view in self.view.subviews) {
        if ([view isKindOfClass : [UITextView class]]) {
            view.scrollsToTop = 아니요;
        }
    }

    self.tableView.scrollsToTop = 예;
}

이것은 UITableViewController의 계층 구조에있는 모든 뷰를 살펴보고 터치 이벤트를 가로 채고 있던 모든 UITextView에서 scrollsToTop을 끕니다. 그런 다음 tableView가 여전히 터치를 수신하는지 확인했습니다.

인터셉트 할 수있는 다른 UITableViews / UIScrollViews / UITextViews를 반복하도록이를 수정할 수 있습니다.

도움이 되었기를 바랍니다!


나는 같은 문제가 있었지만 다음 단계로 해결되었습니다.

  1. 맨 위로 스크롤하려는 tableview에 대해 scrollsToTop = YES를 설정하십시오.
  2. 다른 모든 tableview 또는 collection view 또는 scrollview에 대해 scrollsToTop = NO를 설정하십시오.
  3. tableview 셀에 collection view가있는 경우. collection view에 대해서도 scrollsToTop을 NO로 설정해야합니다.

보기 컨트롤러 / 내비게이션 컨트롤러가 다른보기 컨트롤러의 하위보기로 추가 된 경우 하위 컨트롤러로 설정해야합니다.


Mark가 말했듯이 scrollsToTop 속성이 TRUE로 설정된 UIScrollView (일반적으로 테이블 뷰)의 하위 클래스 하나만 가질 수 있습니다. 일반적으로 뷰에 UITextView와 같은 다른 항목이있을 수 있습니다. scrollsToTop 속성을 FALSE로 설정하기 만하면됩니다.


나는 이것이 꽤 오래된 것이라는 것을 알고 있지만 이것이 도움이되기를 바랍니다. @MarkGranoff가 말한 바에 따르면, 둘 이상의 UIScrollView 또는 하위 클래스가 YES (기본값)로 설정되어 있으면 scrollsToTop이 작동하지 않습니다.이 동작을 실제로 망쳐 놓은 사람을 확인하는 것이 좋습니다. 아래의 간단한 메서드는 뷰의 하위 뷰를 반복하고 뷰에있는 모든 UIScrollView의 scrollsToTop 값을 기록합니다. viewDidAppear 메서드에서 호출하는 것이 좋습니다.

- (void)checkForScrollViewInView:(UIView *)view {
    for (UIView *subview in [view subviews]) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
        }
        if (subview.subviews.count > 0) {
            [self checkForScrollViewInView:subview];
        }
    }
}

이것은 실제로 디버그 코드입니다. UIScrollView 하위 클래스 각각에 대한 scrollsToTop 값을 찾으면 하나만 YES로 설정되어 있는지 확인하십시오.


UIScrollView 헤더 파일에서 :

// 사용자가 상태 표시 줄을 탭하면 상태 표시 줄에 가장 가까운 터치 아래의 스크롤보기가 맨 위로 스크롤되지만 해당 scrollsToTop속성이 YES 인 경우에만 해당 대리자가에서 NO를 반환 shouldScrollViewScrollToTop하지 않으며 아직 그렇지 않습니다. 상단에. // iPhone에서는 scrollsToTop== YES 인 화면 스크롤 뷰가 하나있는 경우에만이 제스처를 실행합니다 . 둘 이상이 발견되면 스크롤되지 않습니다.


예를 들어 다음과 같은 태그와 같은 테이블보기 및 스크롤보기가있는 경우

여기에 이미지 설명 입력

다음과 같이 만들어야합니다. viewDidLoad

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false

로드 된 여러 UIScrollView 하위 항목 이있을 수 있습니다 . 예 : UITableView를 포함하는 각 페이지에 UIPageViewcontroller가 있습니다.

scrollsToTop의 속성입니다 사실 기본적으로.

따라서 중첩 된 UIScrollViews의 scrollsToTop 속성을 처리하는 것 외에도 다음을 수행해야합니다.

//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
    super.viewDidLoad()
    ...
    tableView.scrollsToTop = false
}

//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tableView.scrollsToTop = true
}

//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.tableView.scrollsToTop = false
}

이렇게하면 최상위 UITableView의 scrollsToTop 하나만 true로 설정됩니다.

참고 URL : https://stackoverflow.com/questions/7165913/scroll-to-top-of-uitableview-by-tapping-status-bar

반응형