UITableView, 다시로드 할 때 아래로 스크롤 하시겠습니까?
나는이 UITableView
와 cells
그 동적으로 업데이트됩니다. 테이블 tableview.reload
을 새로 고치려면 (아래 참조) 호출 되는 경우를 제외하고는 모든 것이 잘 작동합니다 cells
. 테이블을 맨 아래로 스크롤하여 새 항목을 표시하고 싶습니다.
- (void)reloadTable:(NSNotification *)notification {
NSLog(@"RELOAD TABLE ...");
[customTableView reloadData];
// Scroll to bottom of UITable here ....
}
사용할 계획 scrollToRowAtIndexPath:atScrollPosition:animated:
이었지만 indexPath
.
이 작업을 수행하는 방법이나 delegate
내가 사용할 수 있는 콜백을 아는 사람이 있습니까?
사용하다:
NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1];
[tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];
또는 섹션 색인을 수동으로 지정할 수 있습니다 (한 섹션 => 색인 = 0 인 경우).
또 다른 해결책은 표를 수직으로 뒤집고 각 셀을 수직으로 뒤집는 것입니다.
초기화 할 때 UITableView에 변환을 적용하십시오.
tableview.transform = CGAffineTransformMakeScale(1, -1);
그리고 cellForRowAtIndexPath에서 :
cell.transform = CGAffineTransformMakeScale(1, -1);
이렇게하면 스크롤 문제에 대한 해결 방법이 필요하지 않지만 contentInsets / contentOffsets 및 머리글 / 바닥 글 상호 작용에 대해 조금 더 생각해야합니다.
-(void)scrollToBottom{
[self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES];
}
//In swift
var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1,
inSection: self.tableView.numberOfSections()-1)
self.tableView.scrollToRowAtIndexPath(iPath,
atScrollPosition: UITableViewScrollPosition.Bottom,
animated: true)
이것은 셀 높이가 클 때 제 경우에 잘 작동하는 또 다른 솔루션입니다.
- (void)scrollToBottom
{
CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height);
if ( bottomOffset.y > 0 ) {
[_bubbleTable setContentOffset:bottomOffset animated:YES];
}
}
이것은 정말 자주 사용하고 싶을 수 있으므로 UITableView에 클래스 확장을 만드는 것이 좋습니다.
extension UITableView {
func scrollToBottom(animated: Bool = true) {
let section = self.numberOfSections
if section > 0 {
let row = self.numberOfRowsInSection(section - 1)
if row > 0 {
self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated)
}
}
}
}
스위프트 3
이 문제를 해결하는 방법을 알아 내려는 모든 사람들에게 핵심은 다음에 .layoutIfNeeded()
메서드 를 호출하는 것입니다 .reloadData()
.
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentSize.height - tableView.frame.height), animated: false)
나는 여러 섹션으로 작업하고 있었고 UITableView
잘 작동했습니다.
확장은 UITableView 대신 UIScrollView에서 수행하는 것이 더 낫습니다. 이렇게하면 scrollView, tableView, collectionView (수직), UIWebView (내부 스크롤보기) 등에서 작동합니다.
public extension UIScrollView {
public func scrollToBottom(animated animated: Bool) {
let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height)
scrollRectToVisible(rect, animated: animated)
}
}
Fot Swift 5
extension UITableView {
func scrollToBottom(animated: Bool = true) {
let section = self.numberOfSections
if section > 0 {
let row = self.numberOfRows(inSection: section - 1)
if row > 0 {
self.scrollToRow(at: IndexPath(row: row-1, section: section-1), at: .bottom, animated: animated)
}
}
}
}
이것이 가장 좋은 방법입니다.
- (void)scrollToBottom
{
CGFloat yOffset = 0;
if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
}
[self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}
이 코드를 시도해보십시오.
self.tableView.reloadData()
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.1, execute: {
let indexPath = IndexPath(row: self.dateSource.count-1, section: 0)
self.tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: true)
})
스위프트 5
func scrollToBottom() {
let section = self.tableView.numberOfSections
let row = self.tableView.numberOfRows(inSection: self.tableView.numberOfSections - 1) - 1;
guard (section > 0) && (row > 0) else{ // check bounds
return
}
let indexPath = IndexPath(row: row-1, section: section-1)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
I dont agree that we should user cells_count
,sections_count
,self.dateSource.count
and so on, Instead, the delegate will be better.
참고URL : https://stackoverflow.com/questions/5112346/uitableview-scroll-to-bottom-on-reload
'IT박스' 카테고리의 다른 글
IE에서 링크 주변의 테두리를 제거하는 방법은 무엇입니까? (0) | 2020.12.06 |
---|---|
소스 트리에서 바이너리 트리로 디렉토리를 복사하는 방법은 무엇입니까? (0) | 2020.12.06 |
자바 스크립트에서 n 문자마다 문자를 삽입하려면 어떻게해야합니까? (0) | 2020.12.06 |
Android에서 드로어 블의 이미지를 동적으로 설정하는 방법은 무엇입니까? (0) | 2020.12.06 |
케이스 전환 : 하나의 숫자 대신 범위를 사용할 수 있습니까? (0) | 2020.12.06 |