26

には 1 ~ 3 個UITableViewCellの がありUITableViewViewます。の後に常にセルを画面の下部に配置する方法はありますreloadDataか?

+----------------+     +----------------+     +----------------+
|                |     |                |     |                |
|                |     |                |     |                |
|                |     |                |     |                |
|                |     |                |     | +------------+ |
|                |     |                |     | |   cell 1   | |
|                |     |                |     | +------------+ |
|                |     | +------------+ |     | +------------+ |
|                |     | |   cell 1   | |     | |   cell 2   | |
|                |     | +------------+ |     | +------------+ |
| +------------+ |     | +------------+ |     | +------------+ |
| |   cell 1   | |     | |   cell 2   | |     | |   cell 3   | |
| +------------+ |     | +------------+ |     | +------------+ |
+----------------+     +----------------+     +----------------+
4

14 に答える 14

13

以前の回答は最新の使用には時代遅れではないため、新しいサンプル ソリューションを作成しました。

最新の手法では、自動レイアウトとセルフサイジング セルが使用されるため、前の回答は機能しなくなります。最新の機能で動作するようにソリューションを作り直し、サンプル プロジェクトを作成して GitHub に配置しました。

追加作業の原因となる各行の高さをカウントアップする代わりに、このコードは最後の行のフレームを取得して、上部からのコンテンツ インセットを計算できるようにします。テーブルビューがすでに行っていることを活用するため、追加の作業は必要ありません。

このコードは、キーボードまたは別のオーバーレイに下部インセットが設定されている場合に備えて、上部インセットのみを設定します。

バグを報告するか、GitHub で改善を提出してください。このサンプルを更新します。

GitHub: https://github.com/brennanMKE/BottomTable

- (void)updateContentInsetForTableView:(UITableView *)tableView animated:(BOOL)animated {
    NSUInteger lastRow = [self tableView:tableView numberOfRowsInSection:0];
    NSUInteger lastIndex = lastRow > 0 ? lastRow - 1 : 0;

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:lastIndex inSection:0];
    CGRect lastCellFrame = [self.tableView rectForRowAtIndexPath:lastIndexPath];

    // top inset = table view height - top position of last cell - last cell height
    CGFloat topInset = MAX(CGRectGetHeight(self.tableView.frame) - lastCellFrame.origin.y - CGRectGetHeight(lastCellFrame), 0);

    UIEdgeInsets contentInset = tableView.contentInset;
    contentInset.top = topInset;

    UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState;
    [UIView animateWithDuration:animated ? 0.25 : 0.0 delay:0.0 options:options animations:^{
        tableView.contentInset = contentInset;
    } completion:^(BOOL finished) {
    }];
}
于 2015-08-26T18:14:54.053 に答える
5

テーブルビューにヘッダーを設定し、最初のセルを押し下げるのに十分な高さにすることができます。次に、それに応じてtableViewのcontentOffsetを設定します。ただし、これを行うための簡単な方法は組み込まれていないと思います。

于 2013-03-08T02:37:40.940 に答える
2

これは、以下の関数を使用して迅速に行うことができます

func updateContentInsetForTableView(tblView: UITableView, animated: Bool) {

    let lastRow: NSInteger = self.tableView(tblView, numberOfRowsInSection: 0)
    let lastIndex: NSInteger = lastRow > 0 ? lastRow - 1 : 0
    let lastIndexPath: NSIndexPath = NSIndexPath(forRow: lastIndex, inSection: 0)
    let lastCellFrame: CGRect = tblView.rectForRowAtIndexPath(lastIndexPath)
    let topInset: CGFloat = max(CGRectGetHeight(tblView.frame) - lastCellFrame.origin.y - CGRectGetHeight(lastCellFrame), 0)
    var contentInset: UIEdgeInsets = tblView.contentInset
    contentInset.top = topInset
    let option: UIViewAnimationOptions = UIViewAnimationOptions.BeginFromCurrentState
    UIView.animateWithDuration(animated ? 0.25 : 0.0, delay: 0.0, options: option, animations: { () -> Void in
        tblView.contentInset = contentInset
    }) { (_) -> Void in }
}
于 2016-06-06T17:05:59.743 に答える
1

これを使って。確かにこれは役に立ちます。

- (void)reloadData
{
    [super reloadData];

    [self recalculateContentInset];
    [self recalculateScrollIndicator];
}

- (void)recalculateContentInset
{
    CGFloat contentInsetHeight = MAX(self.frame.size.height - self.contentSize.height, 0);
    CGFloat duration = 0.0;
    [UIView animateWithDuration:duration
                          delay:0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
        [self setContentInset:UIEdgeInsetsMake(contentInsetHeight, 0, 0, 0)];
    }completion:nil];
}

- (void)recalculateScrollIndicator
{
    if(self.contentSize.height >= self.frame.size.height){
        [self setShowsVerticalScrollIndicator:YES];
    } else {
        [self setShowsVerticalScrollIndicator:NO];
    }
}
于 2014-08-28T18:52:32.493 に答える
0
if(indexPath.row!=CategoriesArray.count-1)  
{    
    cell.hidden = YES;
}

return cell;
于 2013-03-08T05:03:42.550 に答える
0

コード行のないエレガントで迅速なソリューション。

コンテナー ビューを使用し、UITableViewController をコンテナーに配置します (埋め込みセグエ)。

このコンテナには任意の高さを設定できます。

于 2014-11-20T18:11:01.560 に答える