programing

UITable View - 맨 위로 스크롤

closeapi 2023. 4. 21. 20:52
반응형

UITable View - 맨 위로 스크롤

테이블 뷰에서 맨 위로 스크롤해야 합니다.그러나 첫 번째 객체가 섹션 0, 행 0이 될지는 장담할 수 없습니다.제 테이블 뷰는 섹션 5부터 시작할 수도 있습니다.

그래서 전화했을 때 예외를 인정합니다.

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

테이블 뷰의 맨 위로 스크롤하는 다른 방법이 있습니까?

UITableView는 UIScrollView의 하위 클래스이므로 다음 항목도 사용할 수 있습니다.

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

또는

[mainTableView setContentOffset:CGPointZero animated:YES];

그리고 스위프트:

mainTableView.setContentOffset(CGPointZero, animated:true)

Swift 3 이상에서는:

mainTableView.setContentOffset(.zero, animated: true)

참고: 이 답변은 iOS 11 이상에서는 유효하지 않습니다.

나는 더 좋다

[mainTableView setContentOffset:CGPointZero animated:YES];

테이블 뷰에 탑인셋이 있는 경우 이를 빼야 합니다.

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];

가능한 액션:

1

func scrollToFirstRow() {
    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}

2

func scrollToLastRow() {
    let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
}

3

func scrollToSelectedRow() {
    let selectedRows = self.tableView.indexPathsForSelectedRows
    if let selectedRow = selectedRows?[0] as? NSIndexPath {
        self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
    }
}

4

func scrollToHeader() {
    self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
}

5

func scrollToTop(){
    self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
}

맨 위로 스크롤 사용 안 함:

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
    for subview in view.subviews {
        if let scrollView = subview as? UIScrollView {
            (scrollView as UIScrollView).scrollsToTop = false
        }
        self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
    }
}

요건에 따라 수정하여 사용합니다.

스위프트 4

  func scrollToFirstRow() {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
  }

NSIndexPath(빈 테이블)를 사용하지 않는 것이 좋습니다.또, 톱 포인트가 CGPointZero(콘텐츠 인셋)라고 가정하는 것도, 제가 사용하고 있는 것입니다.

[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];

이게 도움이 됐으면 좋겠다.

Swift 4:

이것은 매우 효과적입니다.

//self.tableView.reloadData() if you want to use this line remember to put it before 
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)

사용하지 않다

 tableView.setContentOffset(.zero, animated: true)

때때로 오프셋을 잘못 설정할 수 있습니다.예를 들어, 제 경우, 셀은 실제로 안전 구역이 설치된 시야보다 약간 위에 있었습니다.좋지 않습니다.

대신 사용

 tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

iOS 11에서는adjustedContentInset인콜 상태 바가 표시되는지 아닌지에 관계없이, 양쪽의 경우에 대해서, 올바르게 톱까지 스크롤 합니다.

if (@available(iOS 11.0, *)) {
    [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES];
} else {
    [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES];
}

신속:

if #available(iOS 11.0, *) {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
} else {
    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
}

일부 메서드를 빈 상태로 시도하다가 호출하는 데 문제가 발생했습니다.tableView빈 테이블 뷰를 처리하는 Swift 4의 다른 옵션이 있습니다.

extension UITableView {
  func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
    return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
  }

  func scrollToTop(animated: Bool) {
    let indexPath = IndexPath(row: 0, section: 0)
    if self.hasRowAtIndexPath(indexPath: indexPath) {
      self.scrollToRow(at: indexPath, at: .top, animated: animated)
    }
  }
}

사용방법:

// from yourViewController or yourTableViewController
tableView.scrollToTop(animated: true)//or false

테이블은 다음과 같습니다.contentInset콘텐츠 오프셋 설정CGPointZero동작하지 않습니다.컨텐츠 톱으로 스크롤 하는 것과 테이블 톱으로 스크롤 하는 것이 있습니다.

대신에, 인스톨 된 컨텐츠를 고려하면, 다음과 같이 나타납니다.

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];

이 코드를 사용하면 특정 섹션을 맨 위로 스크롤할 수 있습니다.

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];

Swift 5, iOS 13

이 질문에는 이미 많은 답이 있다는 것을 알지만, 제 경험상 이 방법은 항상 효과가 있습니다.

let last = IndexPath(row: someArray.count - 1, section: 0)
tableView.scrollToRow(at: last, at: .bottom, animated: true)

특히 애니메이션(키보드 등)이나 특정 비동기 태스크로 작업하고 있는 경우에는 더욱 그렇습니다.다른 답변은 거의 맨 아래로 스크롤되는 경우가 많습니다.어떤 이유로 바닥까지 갈 수 없는 경우 경쟁 애니메이션이 원인일 가능성이 높기 때문에 이 애니메이션을 메인 큐의 끝에 디스패치하는 것이 회피책입니다.

DispatchQueue.main.async {
    let last = IndexPath(row: self.someArray.count - 1, section: 0)
    self.tableView.scrollToRow(at: last, at: .bottom, animated: true)
}

이미 메인 큐에 있기 때문에 불필요한 것처럼 보일 수 있지만 애니메이션을 시리얼화했기 때문은 아닙니다.

신속:

tableView.setContentOffset(CGPointZero, animated: true)

스위프트 3

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

tableView.setContentOffset작동하지 않습니다.

용도:

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()

제 이후로tableView온갖 종류의 함정이 가득합니다.이치노

스위프트 3

if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 {
  tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
}

스위프트 2

if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 {
  tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
}

앞서 말한 내용과 더불어 확장자(Swift) 또는 카테고리(Objective C)를 생성하여 나중에 이를 쉽게 만들 수 있습니다.

신속:

extension UITableView {
    func scrollToTop(animated: Bool) {
        setContentOffset(CGPointZero, animated: animated)
    }
}

지정된 tableView를 맨 위로 스크롤하려면 언제든지 다음 코드를 호출할 수 있습니다.

tableView.scrollToTop(animated: true)

저는 다음과 같이 하는 것이 좋으며, 그 이유는 삽입을 고려하기 때문입니다.삽입이 없는 경우에도 삽입이 0이 되므로 맨 위로 스크롤됩니다.

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

신속:

tableView헤더가 없는 경우:

tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

이 경우:

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

Swift 5에서는 Adrian의 답변 정말 감사합니다.

extension UITableView{

    func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
        return indexPath.section < numberOfSections && indexPath.row < numberOfRows(inSection: indexPath.section)
    }

    func scrollToTop(_ animated: Bool = false) {
        let indexPath = IndexPath(row: 0, section: 0)
        if hasRowAtIndexPath(indexPath: indexPath) {
            scrollToRow(at: indexPath, at: .top, animated: animated)
        }
    }

}

사용방법:

tableView.scrollToTop()

iOS 11에서 올바르게 작업하기 위해 사용하는 방법은 다음과 같습니다.

extension UIScrollView {
    func scrollToTop(animated: Bool) {
        var offset = contentOffset
        if #available(iOS 11, *) {
            offset.y = -adjustedContentInset.top
        } else {
            offset.y = -contentInset.top
        }
        setContentOffset(offset, animated: animated)
    }
}

contentOffset을 사용하는 것은 올바른 방법이 아닙니다.이것은 테이블 뷰의 자연스러운 방식이기 때문에 더 좋을 것이다.

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)

이 코드 조각이 유일하게 나에게 효과가 있었다.

Swift 4:

    tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
    tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)

추신 70은 내 머리글과 테이블 뷰 셀의 높이입니다.

func scrollToTop() {
        NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
        [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

UITable View를 맨 위로 스크롤하여 원하는 위치에 이 함수를 호출합니다.

확장자를 통한 Swift 4, 빈 테이블 보기 처리:

extension UITableView {
    func scrollToTop(animated: Bool) {
        self.setContentOffset(CGPoint.zero, animated: animated);
    }
}

tabBarController를 사용하고 있으며, 각 탭마다 테이블 뷰에 몇 개의 섹션이 있기 때문에 이 솔루션이 가장 적합합니다.

extension UITableView {

    func scrollToTop(){

        for index in 0...numberOfSections - 1 {
            if numberOfSections > 0 && numberOfRows(inSection: index) > 0 {
                scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true)
                break
            }

            if index == numberOfSections - 1 {
                setContentOffset(.zero, animated: true)
                break
            }
        }

    }

}

.-1 *화면 그 때문에 상태 과 네비게이션 표시줄의 합계가 됩니다. 화면 밖으로 그 높이로 올라가기 때문에

self.tableView.setContentOffset(CGPointMake(0 , -1 * 
  (self.navigationController!.navigationBar.height +  
  UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)

재빠르게

행 = selectioncellRow=가 있는 경우 섹션의 번호를 매깁니다(설정하지 않은 경우).

//UITableViewScrollPosition.중간, 하단 또는 상단

var lastIndex = NSIndexPath(forRow:  selectioncellRowNumber, inSection: selectionNumber)
self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)

ScrollTableView를 프로그래밍 방식으로 맨 위로 이동하기 위한 코드입니다.

신속:

self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)

Swift-3의 경우:

self.tableView.setContentOffset(CGPoint.zero, animated: true)

Objective-C가 필요하거나 아직 사랑에 빠져 있는 경우:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

빈 TableView의 문제를 해결하는 ScrollToRow 솔루션(검색에 필요).

import UIKit

extension UITableView {
    
    public func scrollToTop(animated: Bool = false) {
        if numberOfRows(inSection: 0) > 0 {
            scrollToRow(
                at: .init(row: 0, section: 0),
                at: .top,
                animated: animated
            )
        }
    }
    
}

언급URL : https://stackoverflow.com/questions/724892/uitableview-scroll-to-the-top

반응형