web-dev-qa-db-ja.com

UITableView:最後のセルのセパレーターを表示する適切な方法

問題は、テーブル/セクションの最後のセルにセパレータを表示する最も右の方法は何ですか。

基本的にこれは私が望んでいることです。

enter image description here これはネイティブの音楽アプリからのもので、UITableViewだけで達成できるはずだと思うようになりますが、セルセパレータにプライベートAPIを使用することはないでしょうか?

実際のセパレータを使用しなくても、セルの下部に1ピクセルの行を追加することで逃げることができます。しかし、私はこのアプローチのファンではありません

  1. セルが選択/強調表示されている場合its separator andprevious cellのセパレータは自動的に非表示になります(「You've夢中になりました」を選択)。そして、これは私が1ピクセルラインを使用する場合、自分でやるのではなくUITableViewに処理させたいものです(セルセパレーターがテーブルビューのエッジまで伸びていない場合、セパレーターと選択されたセルの背景が見えない場合に特に便利です)一緒に素敵な)。
  2. スクロールのパフォーマンスのために、セルを可能な限り平らに保ちたいと思います。

また、UITableViewリファレンスには、私が欲しいものを簡単に取得する方法があると思うようにするものがあります:

IOS 7以降では、セルセパレーターはテーブルビューの端まで拡張されません。このプロパティは、rowHeightがセルのデフォルトの高さを設定するのと同様に、テーブル内のすべてのセルのデフォルトのインセットを設定します。 プレーンスタイルテーブルの下部に描画される「余分な」セパレータの管理にも使用されます。

プレーンスタイルのテーブルの下部に描かれたこれらの「余分な」セパレータを正確に使用する方法を誰かが知っていますか?これはまさに私が必要なものだからです。 separatorInsetではなくUITableViewUITableViewCellを割り当てるとうまくいくと思いましたが、最後のセルにはまだセパレータがありません。

今のところ、最後のセルのセパレーターを模倣するカスタムセクションフッターを使用するという1つのオプションしかありません。また、これは、tableView:titleForFooterInSection:メソッドを使用して実際のセクションフッターを作成する場合は特に良くありません。

30
dariaa

これは、最後のセルにセパレータを追加するために完璧に機能しました。楽しんで!

self.tableView.tableFooterView = [[UIView alloc] init];
17
Timo Cengiz

HeaderViewまたはfooterViewをTableViewに追加すると、最後の区切り線が消えます。

次の例では、最後のセルにセパレータを表示するための回避策を作成できます。さらに実装する必要があるのは、セルを選択した後にこのセパレータを非表示にすることだけです。したがって、動作は他のセルと同じです。

Swift 4.

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

    let result = UIView()

    // recreate insets from existing ones in the table view
    let insets = tableView.separatorInset
    let width = tableView.bounds.width - insets.left - insets.right
    let sepFrame = CGRect(x: insets.left, y: -0.5, width: width, height: 0.5)

    // create layer with separator, setting color
    let sep = CALayer()
    sep.frame = sepFrame
    sep.backgroundColor = tableView.separatorColor?.cgColor
    result.layer.addSublayer(sep)

    return result
}
12
lukszar

自分に合ったものを見つけました。いくつかの言葉で:ITableViewにtableFooterViewを与え、フレームの高さを0に設定します。これにより、実際のセパレーターが正しいインセットで表示されます。

詳細:ストーリーボードを使用している場合、UIViewをテーブルビューの下部(左側のツリービュー)にドラッグして、同じ階層レベルでテーブルビューセルのすぐ下に表示されるようにします。これにより、tableFooterViewが作成されます。もちろん、これはプログラムで行うこともできます。

次に、UITableViewControllerの実装で:

UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];

それがあなたのために働くかどうか私に知らせてください!代わりにtableHeaderViewを使用する場合、最初のセパレーターでも機能する可能性がありますが、試していません。

8
SimonFrr

セクションを使用していない場合は、次のようなことができます。

- (void)viewDidLoad
{
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}

セクションを使用している場合は、各セクションのフッターをメソッドの1ポイントビューとして実装します

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}

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

これにより、実際にはセパレータではない最後のセルにセパレータを設定できるようになります

3
artud2000

これは、行がセルの幅全体を占める場合でも、必要なことを正確に行います。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;
3
Ilario

Swift 4の非常にシンプルなソリューションがあります:

override func viewDidLoad(){}内で、次のコード行を実装しました。

    self.tableView.tableFooterView = UIView(frame: .zero)

したがって、最後のセルのみがセパレーターインセットを取得するようにします。

これは私にとって完璧に機能しました。あなたにも役立つことを願っています!

2
Nii Mantse

同様の問題があり、回避策が見つかりました。 Appleは、最後のuitableviewcellセパレーターを非表示にし、セルを選択した場合、またはそのセルでselectおよびdeselectを呼び出した場合に表示します。

だから私は最高が- (void)layoutSubviewsにあると教えました。区切りビューは_separatorViewそしてそれは私有財産です。セルの選択/強調表示された状態を使用すると、次のようなものを思いつくことができます。

- (void)layoutSubviews
{
    // Call super so the OS can do it's layout first
    [super layoutSubviews];

    // Get the separator view
    UIView *separatorView = [self valueForKey:@"_separatorView"];
    // Make the custom inset
    CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
    newFrame = CGRectInset(newFrame, 15.0, 0.0);
    [separatorView setFrame:newFrame];

    // Show or hide the bar based on cell state        
    if (!self.selected) {
        separatorView.hidden = NO;
    }
    if (self.isHighlighted) {
        separatorView.hidden = YES;
    }
}

このようなもの。

2
Cyupa

IOS 8では、プレーンスタイルのUITableViewがあり、フッターを追加すると、最後の区切り記号がなくなります。ただし、フッターにカスタムセパレータービューを追加することで、簡単に再作成できます。

この例は、Today Widget separatorスタイルを正確に模倣しています。

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        //create footer view
        let result = UIView()
        result.frame.size.height = tableView.rowHeight

        //recreate last cell separator, which gets hidden by footer
        let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
        let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
        vibrancyEffectView.frame = sepFrame
        vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
        result.addSubview(vibrancyEffectView)
        return result
}
2
Vilém Kurz

空のフッターを追加すると、tableviewは残りのすべての行セパレーター(存在しないセルの場合)を削除しますが、最後のセルのセパレーターは引き続き含まれます。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return [UIView new]; 
}
1
Oren

IOS 7.xおよび8.xで動作します(cellForRowAtIndexPathに入れてください):

(PSは「データソースの最大要素」を配列データソースの数に置き換えます)

 if (row == <max elements of your datasource>-1) {
     UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
     separatorLineView.tag = 666;
     separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
     UIView *separator = [cell.contentView viewWithTag:666];
     // case of orientation changed..
     if (separator.frame.size.width != cell.contentView.frame.size.width) {
        [[cell.contentView viewWithTag:666] removeFromSuperview];
        separator = nil;
     }
     if (separator==nil) [cell.contentView addSubview:separatorLineView];
 }
0

これは間違いなく助けです。ワーキング。ただし、属性インスペクタからセパレータ「なし」を設定します。 cellForRowAtIndexPathメソッドで次のコードを記述します

if(indexPath.row==arrData.count-1){
 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,           
 cell.contentView.frame.size.height - 1.0,      
 cell.contentView.frame.size.width, 1)];

    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];
}
0

以下のコードは私のために働いた:

UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.Origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;

それがあなたにも役立つことを願っています。

0
Ashik