34

問題は、テーブル/セクションの最後のセルに区切り記号を表示する最も正しい方法は何かということです。

基本的にこれは私が求めているものです。

ここに画像の説明を入力UITableViewこれはネイティブの音楽アプリからのものです。セルセパレーターにプライベート API を使用していないので、 だけで達成できるはずだと思います。

実際のセパレーターを使用せずに、セルの下部に 1 つのピクセル行を追加して回避できることはわかっています。しかし、私はこのアプローチのファンではありません。

  1. セルが選択/強調表示されると、そのセパレーターのセルのセパレーターが自動的に非表示になります (「You've got to be crazy」が選択された 2 番目のスクリーンショットを参照)。そして、これは、1ピクセルの線を使用する場合、自分で処理する代わりに UITableView に処理してもらいたいものです(これは、セルセパレータがテーブルビューの端まで伸びていない場合に特に便利です, セパレータと選択したセルの背景が見えない一緒にいいです)。
  2. スクロールのパフォーマンスのために、セルをできるだけフラットに保ちたいと思います。

また、 UITableView リファレンスには、必要なものを簡単に取得する方法があると思わせるものがあります。

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

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

現時点では、最後のセルのセパレーターを模倣するカスタム セクション フッターを使用するという 1 つのオプションしか表示されません。これは、メソッドを使用して実際のセクション フッターが必要な場合は特に、良くありませんtableView:titleForFooterInSection:

4

14 に答える 14

9

私はちょうど私のために働く何かを見つけました. 簡単に言うと、UITableView に tableFooterView を指定し、そのフレームの高さを 0 に設定します。これにより、正しいインセットで実際のセパレーターが表示されます。

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

次に、UITableViewController の実装で:

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

それがうまくいくかどうか教えてください!代わりに tableHeaderView を使用すると、最初のセパレーターでも機能する可能性がありますが、試したことはありません。

于 2014-08-27T16:43:11.860 に答える
3

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

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

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

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

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

これにより、実際にはセパレーターではない最後のセルのセパレーターを使用できます。これは、それを操作してセパレーターのように見せることができるフッターです。

于 2014-03-28T15:46:42.837 に答える
2

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

この例は、今日のウィジェット区切りスタイルを正確に模倣しています

    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
}
于 2014-11-13T21:01:43.217 に答える
2

同様の問題があり、回避策を見つけました。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;
    }
}

このようなもの。

于 2014-03-27T15:51:09.227 に答える
1

空のフッターを追加すると、テーブルビューは残りのすべての行区切り記号 (存在しないセルの場合) を削除しますが、最後のセルの区切り記号は引き続き含めます。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return [UIView new]; 
}
于 2015-01-10T21:31:39.480 に答える
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];
}
于 2016-10-14T10:51:53.987 に答える