[ios] 보기가 나타나기 전에 iPhone에서 UITableView의 맨 아래로 스크롤하는 방법

나는이 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)
        }
    }
}