129

UITableViewiOS 7でのみ奇妙な問題があります。

UITableViewCellSeparator最初の行の上と最後の行の下に消えます。行またはいくつかのスクロール操作を選択した後に表示されることがあります。

私の場合、 withスタイルtableViewからロードされます。問題は、デフォルトから変更されていない、確かにありません。StoryboardUITableViewStylePlainUITableViewCellSeparatorStyleUITableViewCellSeparatorStyleSingleLine

Apple Dev Forums (ここここ)で読んだように、他の人がそのような問題を抱えており、いくつかの回避策が見つかりました。たとえば:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

しかし、私はまだそのようなセパレーターの奇妙な動作の理由を探しています.

何か案は?

更新: XCode 5.1 DP と iOS 7.1 ベータ版で見たように、Apple はこの問題を修正しようとしました。テーブルビューの作成後ではなく、リフレッシュした後、必要に応じて最後の行の下にセパレーターが表示されることがあります。

4

37 に答える 37

42

これは私のために働いた:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
于 2013-11-21T01:23:32.723 に答える
12

また、セパレーターがないという問題があり、10進数を返すheightForRowAtIndexPathときにのみ問題が発生することがわかりました。解決:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}
于 2013-10-01T15:26:31.217 に答える
7

アプリでこの問題が発生しました。ユーザーがセルを選択すると、新しいテーブル ビューがナビゲーション コントローラー スタックにプッシュされ、ユーザーがそれをポップすると、セパレーターがありませんでした。テーブルビューデリゲートメソッドを入れること[self.tableView deselectRowAtIndexPath:indexPath animated:NO];で解決しました。didSelectRowAtIndexPath

于 2013-10-17T01:13:37.823 に答える
6

最も簡単な解決策は、セルをリロードした後、上のセルもリロードすることです。

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}
于 2013-10-21T23:12:37.507 に答える
6

データがリロードされ、デフォルトのアニメーションが完了した後で、セルを選択および選択解除してみてください。

追加するだけです:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
于 2013-09-29T16:46:40.970 に答える
4

@ortwin-gentz のコメントに基づいて、このソリューションは iOS 9 で機能します。

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(スウィフトコード)

たとえば、tableView のいくつかのメソッドでendUpdates()を呼び出した後、 fixCellsSeparator()関数を使用します。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

この解決策が誰かに役立つことを願っています!

于 2016-03-26T15:55:25.867 に答える
2

修正するために非常に多くの提案を試みましたが、それを修正できません.最終的に、以下のように区切り線をカスタムすることにしました:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

P/S: willDisplayCellのカスタムであり、 cellForRowAtIndexPathではありません

于 2015-08-18T06:31:11.407 に答える
1

また、UITableView の下部にある区切り線の表示に一貫性がないという問題もありました。カスタム フッター ビューを使用して、同様の行を作成し、潜在的な既存の行 (欠落している場合もありました) の上に表示することができました。

このソリューションの唯一の問題は、Apple がいつか線の太さを変更する可能性があることです。

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}
于 2014-04-06T19:42:17.443 に答える
1

セルの更新を行う前に、セルの選択を削除する必要があります。その後、選択を復元できます。

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];
于 2015-04-12T11:12:02.627 に答える
1

驚くべきことに、セルのseparatorInset値を前後に変更するとうまくいくようです:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;
于 2013-10-16T10:52:43.850 に答える
0

他の誰かが述べたように、この問題はさまざまな形で現れるようです。次の回避策で問題を解決しました。

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
于 2014-10-07T18:16:12.480 に答える
0

スタイルを設定するとviewWillAppearうまくいきました。

于 2015-04-21T09:51:26.923 に答える
0

UITableViewCell サブクラスで、layoutSubviews を実装し、以下を追加します。

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}
于 2014-09-09T13:03:25.277 に答える
0

それは私にとって完全にはうまくいかなかったので、airpaulgの答えを拡張する..

高さを取得するには、heightforfooter メソッドも実装する必要がありました

それから、ライトグレーの色が暗すぎることに気付きました。テーブルビューの現在のセパレーターの色を取得し、それを使用してこれを修正しました:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];

于 2013-11-26T17:39:37.863 に答える
0

この問題を別の方法で解決します。高さが 0.5px で色がライトグレーのレイヤーを、そのサブレイヤーとして tableview.tableFooterView に追加します。

コードは次のようになります。

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;
于 2014-07-22T03:25:17.770 に答える
0

セルがデキュー/作成されるたびに呼び出されるセルのすべてのサブビューをループする必要なく、これを行うシンプルでクリーンで効率的な方法は、古き良き KVC を使用することです。

UIView *separatorView = [self valueForKey:@"separatorView"]; // pull separator using KVC

if (separatorView) {
    separatorView.hidden = NO;
}

それをセルクラスに貼り付けれlayoutSubviewsば、問題が解決するはずです。

于 2016-10-18T22:32:51.390 に答える
0

私にとってうまくいったのは、beginUpdatesとendUpdatesの後にデータをリロードすることでした:

private func animateCellHeighChangeForTableView(tableView: UITableView, withDuration duration: Double) {
     UIView.animateWithDuration(duration) { () -> Void in
        tableView.beginUpdates();
        tableView.endUpdates();
        tableView.reloadData();
     }
}
于 2016-06-04T03:54:24.420 に答える
0

私たちのプロジェクトでもこの問題に遭遇しました。私のテーブルビューには、これを実現できる tableFooterView がありました。そのtableFooterViewを削除すると、最後の行の下にセパレーターが表示されることがわかりました。

于 2014-02-22T11:37:43.857 に答える
0

同様の問題が発生しました。特に dataSource が大きくない場合は、メソッドを実装するときに tableData をリロードすることで、別の良い解決策が見つかりました。-(void)scrollViewDidScroll:(UIScrollView *)scrollView例を次に示します。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

目に見える dataSource に基づいて、目に見えないデータをリロードすることもできますが、それにはさらにハッキングが必要です。

UITableViewDelegateこのデリゲート関数はプロトコルに該当することに注意してください。

それが役に立てば幸い!

于 2016-05-05T16:36:15.067 に答える
0

答えと解決策を調べてみると、次のような観察結果が得られました。

これは、iOS 7 と 8 の両方で問題があるようです。viewDidLoadメソッドでコードからセルを選択するときに問題に気付きました。

viewDidAppear:1)ビューの表示とセルの選択の間の顕著な遅延を誰かが気にしない場合、回避策はそうしていました

2)2番目の解決策は私にとってはうまくいきましたが、コードは内部実装に基づいているため、少し壊れやすいように見えますUITableViewCell

3) 独自のセパレーターを追加することは、現時点では最も柔軟で最適なようですが、より多くのコーディングが必要です :)

于 2014-11-27T08:43:15.163 に答える
0

これがこの問題に対する私の解決策です。セルを挿入したら、セクションをリロードします。セクション全体をリロードするのが面倒な場合は、上下の indexPath をリロードしてください。

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];
于 2015-09-11T17:36:22.907 に答える
-3

IB で次のように設定することでこの問題を解決しました: Separator Inset = custom、left = 0、right = 0

于 2013-11-22T07:07:19.803 に答える