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
'programing' 카테고리의 다른 글
현재 분기의 끝부분이 원격 분기의 끝부분 뒤에 있기 때문에 업데이트가 거부되었습니다. (0) | 2023.04.21 |
---|---|
목록에 문자열이 포함된 요소가 포함되어 있는지 확인하고 해당 요소를 가져옵니다. (0) | 2023.04.21 |
저장 프로시저에서 새 GUID를 생성하는 방법 (0) | 2023.04.21 |
몬테카를로 시뮬레이션에서는 Excel의 RAND() 함수가 얼마나 좋습니까? (0) | 2023.04.16 |
코드 뒤의 이미지 소스 변경(Wpf) (0) | 2023.04.16 |