9

iMessageのバブルテキストの動作を。で模倣しようとしていUITableViewます。常に一番下までスクロールするために、scrollToRowAtIndexPathwhenviewDidLoadとを使用してviewDidAppearいます。これは、viewDidLoadメソッドが呼び出されたときにテーブルが完全にロードされていないため、追加のスクロールが必要になるためですviewDidAppear。このコードがトリックになります。ただし、必要なのはアニメーションスクロールではなく(設定animatedするとNOこれは解決されません)、テーブルをロードして最後の行に移動するのではなく、常に下からテーブルを表示する必要があります。

これは可能ですか?目的の動作に完全に適合するソリューションが見つかりません。

4

9 に答える 9

27

これが最善の解決策です。

すべてを逆にするだけ!

tableView.transform = CGAffineTransformMakeRotation(-M_PI);
cell.transform = CGAffineTransformMakeRotation(M_PI);

スウィフト 4.0:

tableView.transform = CGAffineTransform(rotationAngle: -CGFloat.pi)
cell.transform = CGAffineTransform(rotationAngle: CGFloat.pi)

ただし、headerView と footerView の位置も逆になっているため、注意してください。

于 2016-04-21T07:09:32.270 に答える
9

viewDidAppear 内からスクロールすると最初の呼び出しが冗長になるため、viewDidLoad からの呼び出しを回避できます。viewDidAppear はビューに戻るたびに呼び出されますが、viewDidLoad はビューが初期化されたときに 1 回だけ呼び出されます。

UITableView がデータをロードする方法を変更する代わりに、ユーザーからスクロールを非表示にするという以前の提案に同意します。私の提案は、viewWillAppear メソッドで scrollToRowAtIndexPath メソッドを使用し、アニメーションを NO に設定することです。その後、テーブルがユーザーに表示されている間に新しい行を追加する必要がある場合は、insertRowsAtIndexPaths:withRowAnimation: を使用して、テーブル ビューの下部に行を追加します。データモデルの最後にデータを追加して、ユーザーが移動して戻ってきたときに同じレイアウトに戻るように注意してください。

お役に立てれば。

編集:以前の回答を受け入れない理由を見て、もう少し詳しく説明したいと思いました。私が提案するソリューションは最小限の労力で済み、reloadData を何度も呼び出すことを避け、scrollToRowAtIndexPath メソッドを何度も呼び出すことを避けます。テーブル ビューの一番下までスクロールするには、viewWillAppear で scrollToRowAtIndexPath を 1 回呼び出すだけで済みます (そうすると、遷移がユーザーに表示されなくなります)。再度行う必要はありません。

于 2012-12-11T13:48:28.980 に答える
4

私が構築した RPN 計算機で同様のことを行います。すべての数字を含むテーブル ビューがあり、数字がスタックに追加されると、すべてが 1 つのセルに表示されます。ビューをロードすると、次のように呼び出します。

[self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:NumOfStackItems - 1 inSection:0]
                        atScrollPosition:UITableViewScrollPositionTop animated:NO];

私の見解では表示されます。このようにして、テーブル ビューがスタックの一番下に表示され始め、アニメーションは表示されません。これをviewWillAppearに入れることで、ビューに移動するたびにテーブルの一番下に表示されます。

スタックに数値を追加するときは、すべての数値を保持する配列に追加し、次のように適切な行にテキストを配置します。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Cell initialization here...
    NSUInteger row_num = [indexPath row];
    cell.rowNumber.text = [NSString stringWithFormat:@"%g", [DataArray objectAtIndex:NumberOfStackItems-row_num-1];// subtract the row number off to get the correct array index
    return cell
}

また、テーブルビューを新しい値で更新するときは常に、最初に reloadData 関数を呼び出し、次に上で引用した scrollToRowAtIndexPath 関数を呼び出すようにします。このようにして、テーブルの一番下に留まります。

于 2012-12-12T13:54:03.190 に答える
2

UITableViewを非表示にして、テーブルを一番下までスクロールした直後viewDidLoadに表示に変更できます。viewDidAppearこのように、ユーザーはスクロールアニメーションを見ることができません。

于 2012-11-02T14:04:18.790 に答える
2

解決策は、オーバーライドviewWillAppearして(アニメーション化されていない)下にスクロールさせることです。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self goToBottom];
}

-(void)goToBottom
{
    NSIndexPath *lastIndexPath = [self lastIndexPath];
    [self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}

-(NSIndexPath *)lastIndexPath
{
    NSInteger lastSectionIndex = MAX(0, [self.tableView numberOfSections] - 1);
    NSInteger lastRowIndex = MAX(0, [self.tableView numberOfRowsInSection:lastSectionIndex] - 1);
    return [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];
}

これを実行viewWillAppearすると、ユーザーがテーブルを見る前に実行されます。

于 2012-12-13T10:28:45.177 に答える
1

非表示のフッターを作成し、そこで計算を行うことで修正できます。フッターが読み込まれると、contentSize が更新されます。スクロールするには、テーブルビューの contentOffset の設定を確認します。

アニメーションの部分はコメントアウトしましたが、コメントアウトしなくてもよかったのですが、それでも機能します。

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if( tableView.contentOffset.y != tableView.contentSize.height - tableView.frame.size.height && automaticScroll ){

        //[UIView animateWithDuration:0.0 animations:^{

            self.contentTableView.contentOffset = CGPointMake(0, tableView.contentSize.height - self.contentTableView.frame.size.height);

        //} completion:^(BOOL finished) {

            [tableView reloadData];

        //}];

        automaticScroll = NO;
    }

    UIView *emptyFooter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
    emptyFooter.backgroundColor = [UIColor clearColor];
    return emptyFooter;
}

下へのスクロールをトリガーする BOOL automaticScroll を作成しました。これは、viewWillAppear メソッドで設定するか、データをロードして tableView をリロードするたびに設定する必要があります。

行を追加する場合は、次のように BOOL も設定する必要があります。

-(void)addItemButtonClicked:(id)sender
{
    automaticScroll = YES;
    //Add object to data
    [self.contentTableView reloadData];
}

さらにサポートが必要な場合は、お知らせください。

于 2012-12-11T12:22:28.310 に答える
0

高さが親ビューより小さい場合は、データをロードした後にコンテンツ インセットを変更して、テーブル ビューのコンテンツ ビューを移動するだけです。

[self.tableView reloadData];         
[self.tableView setContentInset:UIEdgeInsetsMake(self.view.frame.size.height - self.tableView.contentSize.height < 0 ? 0 : self.view.frame.size.height - self.tableView.contentSize.height, 0, 0, 0)];
于 2016-08-12T12:23:28.833 に答える
0
scrollToRowAtIndexPath

テーブルビューの行を特定の位置にスクロールするために使用します

于 2012-11-02T14:24:11.153 に答える