2014-07-18 2 views
1

iOS iMessage 세부보기와 같은 tableView가 있습니다. 또한 "이전 메시지로드"에서 사용하는 tableView 맨 위에 버튼이 있습니다."이전 항목로드"버튼을 클릭하면 UITableView의 스크롤 위치를 이전 위치로 설정하는 방법

tableView를 위로 스크롤하면 버튼이 나타나고 버튼을 클릭하면 이전 레코드를 채우고 tableView를 다시로드합니다.

레코드가 tableView에 다시 채워지지만 스크롤 위치는 변경되지 않습니다.

그런데 이전의 위치 값과 setcontentoffset을 이전의 CGPoint으로 스크롤하려고했습니다. 하지만 버튼을 클릭했을 때 스크롤 위치가 항상 0임을 알게되었습니다. 그래서, 내가 setcontentoffset을 설정 한 후에, 스크롤은 상단을 유지합니다.

scrollview의 위치를 ​​이전 영역으로 재배치해야합니다.

--- 편집 ---

나는 "있는 ScrollView의 이전 위치를 유지"내 방법을 개선하려고합니다.

그리고 해결책을 발견하고 잘 작동합니다. 나는 모두를 위해 공유 할 것이다;

.h 파일에 다음을 추가하십시오. @property (nonatomic) CGFloat scrollsPreviousLocation;@synthesize scrollsPreviousLocation; .m 파일.

자, 여기 트릭이 있습니다 : 아래쪽에서 스크롤의 위치를 ​​계산합니다. 맨 위부터 아닙니다. 계산 과정 후

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    scrollsPreviousLocation = (self.tableView.contentSize.height - scrollView.contentOffset.y); 
} 

은, 지금은 이전 위치 오프셋 내용을 설정해야합니다;

[tableView reloadData]; 
CGPoint offset = CGPointMake(0,tableView.contentSize.height - scrollsPreviousLocation); 
[tableView setContentOffset:offset animated:NO]; 
+0

: 여기 신속한 내 코드 [self.tableView setContentOffset : CGPointMake (0, 0) 애니메이션 : YES]; 테이블 뷰를 스크롤 할 지점을 설정하십시오. – Pawan

답변

7

이전 내용을로드하기 전에 테이블보기의 맨 위에 있으면 contentOffset에 대해 0입니다. 위의 이전 메시지 행에 테이블 뷰를 다시로드 한 후 같은 스크롤 위치에 숙박 할 수있게하려면, 당신은이 작업을 수행해야합니다 : 그것은

// Save the contentSize of your table view before reloading it 
CGFloat oldTableViewHeight = self.tableView.contentSize.height; 

// Reload your table view with your new messages 

// Put your scroll position to where it was before 
CGFloat newTableViewHeight = self.tableView.contentSize.height; 
self.tableView.contentOffset = CGPointMake(0, newTableViewHeight - oldTableViewHeight); 

의 그!

이전 테이블보기 콘텐츠 크기 높이가 10이고 새 콘텐츠가 19 인 경우 콘텐츠 오프셋을 19 - 10과 같은 9 (즉, 다시로드하기 전에 하단에서 10 개)로 설정하려고합니다.

+0

내 솔루션에서 더 쉽고 간편합니다. 감사합니다. – blckhm

+0

달콤하고 간단합니다. '[tableView insertRowsAtIndexPaths ...]'와는 작동하지 않지만 여전히 아주 좋습니다. – SoftDesigner

+0

행의 높이가 가변이고 tableview에 여러 섹션이있는 경우 위치가 다릅니다. 그 시나리오에 대한 좋은 해결책을 찾을 수 없었습니다. 누구든지 알려 주시면 알려 드리겠습니다. –

0

@ Kevin Hirsch의 답변이지만 자동 레이아웃 모드에서는 tableView.layoutIfNeeded()를 추가해야합니다. 그렇지 않으면 예상 높이가 표시됩니다.

// Save the contentSize of your table view before reloading it 

let oldTableViewHeight = self.tableView.contentSize.height 

// Reload your table view with your new messages 

self.tableView.layoutIfNeed() 

// Put your scroll position to where it was before 

let newTableViewHeight = self.tableView.contentSize.height; 

self.tableView.contentOffset = CGPointMake(0, newTableViewHeight - oldTableViewHeight); 
관련 문제