나는이 UITableView
변수 높이의 세포로 채워된다. 뷰를 볼 때 테이블을 맨 아래로 스크롤하고 싶습니다.
나는 현재 다음과 같은 기능을 가지고 있습니다
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log는 각 셀의 내용을 구성하는 객체를 포함하는 가변 배열입니다.
위의 코드는 잘 작동 viewDidAppear
하지만 뷰가 처음 나타날 때 테이블 상단을 표시 한 다음 맨 아래로 점프하면 불행한 부작용이 있습니다. 나는 그것을 선호합니다table view
가 나타나기 전에 하단으로 스크롤 할 수 .
나는 스크롤을 시도 viewWillAppear
하고viewDidLoad
있지만, 두 경우 모두 데이터가 테이블에로드 아직 예외를 던져 모두되지 않았습니다.
내가 가진 것이 가능한 전부라고 말한 경우에도 모든 지침은 대단히 감사하겠습니다.
답변
나는 그 부름을 믿는다
tableView.setContentOffset(CGPoint(x: 0, y: CGFloat.greatestFiniteMagnitude), animated: false)
당신이 원하는 것을 할 것입니다.
답변
가장 쉬운 방법은 다음과 같습니다.
if (self.messages.count > 0)
{
[self.tableView
scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.messages.count-1
inSection:0]
atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
스위프트 3 버전 :
if messages.count > 0 {
userDefinedOptionsTableView.scrollToRow(at: IndexPath(item:messages.count-1, section: 0), at: .bottom, animated: true)
}
답변
에서 야곱의 대답 이 코드는 다음과 같습니다
- (void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (self.messagesTableView.contentSize.height > self.messagesTableView.frame.size.height)
{
CGPoint offset = CGPointMake(0, self.messagesTableView.contentSize.height - self.messagesTableView.frame.size.height);
[self.messagesTableView setContentOffset:offset animated:YES];
}
}
답변
컨텐츠의 정확한 끝으로 스크롤해야하는 경우 다음과 같이 수행 할 수 있습니다.
- (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];
}
답변
자동 레이아웃을 사용하고 있으며 아무런 대답도 없습니다. 마침내 작동 한 내 솔루션은 다음과 같습니다.
@property (nonatomic, assign) BOOL shouldScrollToLastRow;
- (void)viewDidLoad {
[super viewDidLoad];
_shouldScrollToLastRow = YES;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// Scroll table view to the last row
if (_shouldScrollToLastRow)
{
_shouldScrollToLastRow = NO;
[self.tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];
}
}
답변
@JacobRelkin 이 인정한 솔루션 자동 레이아웃을 사용하는 iOS 7.0에서 작동하지 않았습니다.
사용자 정의 하위 클래스가 UIViewController
있고 _tableView
의 하위 뷰로 인스턴스 변수 를 추가 했습니다 view
. 나는 위치 _tableView
자동 레이아웃을 사용하여. 나는이 메소드를 마지막 viewDidLoad
과 끝에서 호출하려고 시도 했다.viewWillAppear:
. 둘 다 일하지 않았다.
그래서의 사용자 정의 하위 클래스에 다음 메소드를 추가했습니다 UIViewController
.
- (void)tableViewScrollToBottomAnimated:(BOOL)animated {
NSInteger numberOfRows = [_tableView numberOfRowsInSection:0];
if (numberOfRows) {
[_tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:numberOfRows-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:animated];
}
}
작품 [self tableViewScrollToBottomAnimated:NO]
의 끝에서 전화 viewDidLoad
. 불행히도 tableView:heightForRowAtIndexPath:
모든 셀에 대해 세 번 호출됩니다.
답변
다음은 Swift 2.0에서 구현 한 확장입니다. 이 함수는 tableview
로드 된 후에 호출해야합니다 .
import UIKit
extension UITableView {
func setOffsetToBottom(animated: Bool) {
self.setContentOffset(CGPointMake(0, self.contentSize.height - self.frame.size.height), animated: true)
}
func scrollToLastRow(animated: Bool) {
if self.numberOfRowsInSection(0) > 0 {
self.scrollToRowAtIndexPath(NSIndexPath(forRow: self.numberOfRowsInSection(0) - 1, inSection: 0), atScrollPosition: .Bottom, animated: animated)
}
}
}