web-dev-qa-db-ja.com

iOS 7のUITableViewセルにセパレータに改行がないようにする方法はありますか?

IOS 7では、UITableViewCellsには​​iOS 6にはないセルの区切りに改行があることに気付きました。この改行を取り除く方法はありますか?セパレーターをnoneに変更してから、セパレーターの色でUIViewを作成しても、それにもかかわらず、白いセパレーターが発生します。

68

iOS7の場合:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
}

iOS8の場合:

まず、次のようにテーブルビューを構成します。

if ([self.tableView respondsToSelector:@selector(layoutMargins)]) {
    self.tableView.layoutMargins = UIEdgeInsetsZero;
}

次に、cellForRowAtIndexPath:メソッドで、セルを次のように構成します。

if ([cell respondsToSelector:@selector(layoutMargins)]) {
    cell.layoutMargins = UIEdgeInsetsZero;
}

注:両方のiOSバージョンをサポートするには、layoutMarginsseparatorInsetの両方を含めます

116
Luis E. Prado

ストーリーボードから「Separator Inset」を設定することもできます。

enter image description here

enter image description here

44
null

IOSの古いバージョンをサポートする場合は、このメソッドを呼び出す前に、このメソッドの可用性を確認する必要があります。

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
37
boro

理解した。

[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
16

スイフト版

iOSはセルおよびテーブルビューにlayoutMarginsプロパティを導入します。

このプロパティはiOS 7.0では使用できないため、割り当てる前に確認する必要があります!

ただし、Appleはセルに**プロパティを追加して、Table Viewのマージン設定を継承できないようにします。このように、セルはTable Viewとは無関係に独自のマージンを構成できます。オーバーライドとして。

このプロパティはpreservesSuperviewLayoutMarginsと呼ばれます。NOに設定すると、テーブルビューのlayoutMargin設定を独自のセルのlayoutMargin設定でオーバーライドできます。両方とも時間を節約し(テーブルビューの設定を変更する必要はありません)、より簡潔です。詳細な説明については、マイクアブドラの回答を参照してください。

注:これは、Mike Abdullahの答えに表されているように、適切で、面倒ではない実装です。セルのpreservesSuperviewLayoutMargins = NOを設定すると、Table Viewがセル設定を上書きしないようになります。

最初のステップ-セルの余白を設定します:

/*
    Tells the delegate the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Remove seperator inset
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }

    // Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }

    // Explictly set your cell's layout margins
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}

セルのpreservesSuperviewLayoutMarginsプロパティをNOに設定shouldテーブルビューがセルマージンを上書きしないようにします。場合によっては、正常に機能しないようです。

2番目のステップ-すべてが失敗した場合にのみ、Table Viewのマージンをブルートフォースすることができます:

/*
    Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Force your tableview margins (this may be a bad idea)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }

    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}

...そしてそこに行きます!これは、iOS 7と同様にiOS 8でも動作するはずです。

注:iOS 8.1および7.1を使用してテストしました。私の場合、この説明の最初のステップを使用するだけでした。

2番目のステップは、レンダリングされたセルの下に未入力のセルがある場合にのみ必要です。テーブルがテーブルモデルの行数より大きい場合。 2番目の手順を実行しないと、異なるセパレータオフセットが発生します。

9
King-Wizard

選択した答えは私にはうまくいきませんでした。しかし、これははい、IOS 2.0から動作します:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
9
anasaitali

アプリ全体の永続的なソリューションの場合、application:didFinishLaunchingでこれを呼び出します..すべてのテーブルビューが「修正」されます

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
  [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero];
}
8
Rafael Nobre

IOS 8では、Seth McFarlaneの投稿 here に基づいて、layoutMarginsの処理を開始する必要があります。以下は私のためにそれをしました:

  1. ApplicationDidFinishLaunchingで、次を実行します。

    if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
        [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
    }
    
  2. UITableViewで次のカテゴリを作成します。

    @interface UITableView(WJAdditions)
    -(void) wjZeroSeparatorInset;
    @end
    
    @implementation UITableView (WJAdditions)
    -(void) wjZeroSeparatorInset {
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
      if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
        self.layoutMargins = UIEdgeInsetsZero;
      }
    #endif
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
       if ([self respondsToSelector: @selector(setSeparatorInset:)])
          self.separatorInset = UIEdgeInsetsZero;
       }
    #endif
    }
    @end
    
  3. UITableViewsで、初期化後すぐに呼び出します

    [self wjZeroSeparatorInset];
    
  4. UITableViewControllersでは、次のものが必要です。

    -(void) viewWillLayoutSubviews {
      [super viewWillLayoutSubviews];
      UITableView* tv = self.tableView;
      if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
        [tv setLayoutMargins:UIEdgeInsetsZero];
      }
    }
    
7

IOS 8では、小さなバグがあるようです。セパレーターインセットのカスタム値は、テキストが含まれるセルには適用されません。インターフェイスビルダーとコードを使用して設定しようとしましたが、どちらも機能しませんでした。私もバグレポートを提出しました。

enter image description here

それまでの間、これを達成するための小さな回避策があります。セルに線を引くだけです。 UITableViewCellのサブクラスを作成し、drawRectメソッドをオーバーライドします。また、UITableViewのseparatorプロパティをNoneに設定することを忘れないでください。これがコードです。 Swiftにありますが、基本的にCなので、Objective-Cでも同じことを使用できます。

override func drawRect(rect: CGRect) {
    super.drawRect(rect)

    let context = UIGraphicsGetCurrentContext()
    CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color
    CGContextSetLineWidth(context, 2) // separator width

    CGContextMoveToPoint(context, 0, self.bounds.size.height)
    CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height)
    CGContextStrokePath(context)
}
6
Isuru

SeparatorInsetをリセットすると、この問題が解決されます。

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [self.tableView setSeparatorInset:self.tableView.separatorInset];
}
4
user2088250

ソリューション:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

   if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
   }
}
3
Tea

TableViewのseparatorInsetをUIEdgeInsetsZeroに設定すると、同時にセクションタイトルの左マージンが壊れるように注意してください! (少なくともiOS 7.1ではそうです)

TableView:titleForHeaderInSection:を使用してセクションタイトルを表示し、UITableViewCells間に改行がないという希望の効果を引き続き取得する場合は、tableViewではなくセルにseparatorInsetを直接設定する必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...
    [cell setSeparatorInset:UIEdgeInsetsZero];
2
Bluezen

iOS8 +の場合、これでうまくいきました。

tableView.layoutMargins = UIEdgeInsetsZero

およびcellForRowAtIndexPathメソッド内:

cell.layoutMargins = UIEdgeInsetsZero;
1
Zaid Pathan
@implementation UITableView (HGApperance) 
-(void)setSeparatorXMargin:(CGFloat)margin{
    // iOS 7
    if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
        [self setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self respondsToSelector:@selector(layoutMargins)]) {
        self.layoutMargins = UIEdgeInsetsZero;
    }
}
@end

UITableviewCellの場合、Williamの answer は完璧に機能します。

0
HamGuy

iOS8以上へ

すべてのソリューションが私のように機能しない場合は、UITableViewCellのサブクラスを使用し、layoutSubviewsメソッドをオーバーライドした可能性があります。2つの条件を満たしている場合は、読み進めてください。 。

ステップごとに実行または確認します。

1、UITableViewを割り当てて初期化した後、layoutMarginsプロパティを設定します。

_if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    _tableView.layoutMargins = UIEdgeInsetsZero ;
}
_

2、メソッド- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathで、カスタムUITableViewCellを割り当てて初期化した後、そのlayoutMarginsプロパティを設定します。

_if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
    cell.layoutMargins = UIEdgeInsetsZero ;
}
_

3、最も重要な部分が入ります。UITableViewCellの- (void)layoutSubviewsメソッドをオーバーライドする場合、そのスーパーを呼び出すことを忘れないでください

_- (void)layoutSubviews
{
    [super layoutSubviews] ;

    // layout the subviews
}
_
0
KudoCC
- (void)viewDidLoad
{
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

    [super viewDidLoad];

    // Additional setup
}

注:setSeparatorStyle行は、スーパーコールの上にある必要があります。

0
Matt Rundle

Xamarin.iOSバージョン

IOS 8.4上のXamarin.iOSでUITableViewセパレーターをLuis E. Pradoおよびキングウィザード。動作させるにはSeparatorInsetとLayoutMarginsの両方を設定する必要がありました。 iOS 8以降をターゲットにしているため、以前のiOSバージョンのチェックを作成しませんでした。

UITableViewまたはUITableViewCellレベルでUITableViewセパレーターの全幅を設定するために、次の2つのC#拡張メソッドを作成しました。目的の効果に応じて、これらの方法のいずれかまたは両方を使用できます(以下の説明を参照)。

ITableView

UITableViewプロパティを設定して、空のセルの後に表示されるセパレーターを変更します。このSetLayoutMarginsZeroメソッドは、関連するViewControllerのViewDidLoadメソッドから呼び出すことができます。

public static void SetLayoutMarginsZero(this UITableView tableView)
{
    tableView.SeparatorInset = UIEdgeInsets.Zero;
    tableView.LayoutMargins = UIEdgeInsets.Zero;
}

ITableViewCell

UITableViewCellプロパティを設定して、セルが入力された後に表示されるセパレータを変更します。このSetLayoutMarginsZeroメソッドは、TableViewSource GetCellメソッドから呼び出すことができます。

public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell)
{
    tableViewCell.SeparatorInset = UIEdgeInsets.Zero;
    tableViewCell.LayoutMargins = UIEdgeInsets.Zero;
    tableViewCell.PreservesSuperviewLayoutMargins = false;
}
0
Mobile Dan