web-dev-qa-db-ja.com

UITableViewの最後のセルの最後の境界線を削除するにはどうすればよいですか?

私のアプリでは、UITableViewを使用しています。私の問題は、UITableViewの最後のセルの最後の境界線を削除することです。

次の画像を確認してください。

enter image description here

68
user2289379

9/14/15に更新されました。私の最初の答えは時代遅れになりましたが、それはすべてのiOSバージョンのための普遍的なソリューションです。

tableViewの標準の区切り線を非表示にし、各セルの上部にカスタム行を追加できます。カスタムセパレーターを追加する最も簡単な方法は、高さ1pxの単純なUIViewを追加することです。

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];

これまで、私は 別の方法 をサブスクライブして、セルの下に余分なセパレータを隠しました(iOS 6.1以降で動作します):

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
22
onegray

最適なソリューションは、フッタービューを追加することです。次のコードは、最後のセルの行を完全に非表示にします。

Objective-C

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];

Swift 4.

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
126
Tonny Xu

IOS 7では、より簡単なソリューションがあります。セルが最後のセルであると仮定します。

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
40
davidisdk

これは、iOS 7および8で機能します。

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));

注:tableView.boundsの使用には注意してください。呼び出しのタイミングによっては間違った値が報告されることがあります。 ランドスケープモードでの誤った境界のレポート を参照してください

13
Jamie Forrest

このコード行をviewDidLoad()に追加します。

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

これにより、最後のセパレータが置き換えられ、置き換えられた(非表示の)フッタービューが余分な高さを占有しないようにします。フッタービューの幅はUITableViewによって管理されるため、0に設定できます。

6
Jonny

私の短いバージョン:

self.tblView.tableFooterView = [UIView new];
3
Marco Mardegan

ここに私が現在使用している治療法があります。それは最善のアプローチではないかもしれませんが、うまくいきます。

SeparatorColorとsetSeparatorStyleを削除してカスタムセパレーターを作成する

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setSeparatorColor:[UIColor clearColor]];
}

テーブルビューの背景を持つ各セルにカスタムセパレーターを追加します

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    ...

    UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
    separatorLineView.backgroundColor = self.tableView.backgroundColor;
    [cell.contentView addSubview:separatorLineView];

    return cell;
}
2
rtato

いいえ、できません。これらのセパレーターはきれいで乾燥しており、スタイルと色はそれだけです。ただし、別の解決策は、セパレータをすべてオフにし、最後のセルを除くすべてのセルの下部に水平線を付けた背景画像を設定することです。

E.X:

    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    if (indexPath.row == [myArray count] - 1) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
        [cell setBackgroundView:imageView];
    }
2
Mick MacCallum

Swift 4、iOS 12でテスト済み)の拡張ベースのソリューション

height = 1の空のビューを設定すると、最後に表示されるセルのセパレータも削除されることに気付きましたが、height = 0を設定すると、空のセルのセパレータが削除されるだけです。

extension UITableView {
    func removeSeparatorsOfEmptyCells() {
        tableFooterView = UIView(frame: .zero)
    }

    func removeSeparatorsOfEmptyCellsAndLastCell() {
        tableFooterView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0, height: 1)))
    }
}
2
fl034

IOS 7以降の場合

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL bIsLastRow = NO;

        //Add logic to check last row for your data source
        NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
        if([_arrDataSource lastObject] == dict)
        {
           bIsLastRow = YES;
        }

        //Set last row separate inset left value large, so it will go outside of view
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
        {
            [cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
        }
    }
1
Aditya Deshmane

以下のコードは、UITableViewの最後の行からセパレーターを削除するのに役立ちます。

Swift 3.0

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) { cell.separatorInset.right = cell.bounds.size.width } }

1
user2991638

In Swift単純に:

tableView.tableFooterView = UIView()
1
DungeonDev

別のオプションは、UITableViewをサブクラス化することです。

@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
    if (_hideLastSeparator == hideLastSeparator) {
        return;
    }
    _hideLastSeparator = hideLastSeparator;
    if (_hideLastSeparator) {
        _hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
        _hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        _hideLastSeparatorView.backgroundColor = self.backgroundColor;
        [self addSubview:_hideLastSeparatorView];
        [self hideSeparator];
    }
    else {
        [_hideLastSeparatorView removeFromSuperview];
        _hideLastSeparatorView = nil;
    }
}
-(void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    if (_hideLastSeparator) {
        [self hideSeparator];
    }
}
-(void)hideSeparator {
    CGRect frame = _hideLastSeparatorView.frame;
    frame.Origin.y = self.contentSize.height - frame.size.height;
    _hideLastSeparatorView.frame = frame;
}

.hには、hideLastSeparatorおよびhideLastSeparatorViewのプロパティ宣言のみを含める必要があります。
セパレータを非表示にする場合は、新しいクラスを使用してmyTableView.hideLastSeparator = YES
これが機能する方法は、新しいビューを追加することで最後のセパレーターを遮ることです。

私の意見では、これはやや簡単です(カスタムセパレーターを使用するか、最後のセルの最後のseparatorInsetを設定するよりも)tableFooterViewを設定する方法が時々引き起こす(たとえば行中に)奇妙なアニメーション挿入/削除またはその他のテーブルアニメーション)。

0
alex-i

cellForRowデリゲートの最後のセルインデックスを見つけ、以下のコード行を配置します。

cell.separatorInset = UIEdgeInsetsMake(
    0.f,
    40.0f,
    0.f,
    self.view.frame.size.width-40.0f
);
0

_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

0
ohana

Swift 4.2

最後のセルで左から右に向かうセパレーターを取得するには、これを_UITableViewDataSource's_ tableView(_:cellForRowAt:)実装に追加します。

_if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
        cell.separatorInset = .zero
}
_

特定のセルに区切り文字が必要ない場合は、独自の区切り文字を描画して_tableView.separatorStyle = .none_を設定することを検討してください。

0
JanApotheker