it-swarm.asia

إخفاء خط فاصل على UITableViewCell واحد

أنا تخصيص UITableView. أريد إخفاء السطر الفاصل على آخر خلية ... هل يمكنني القيام بذلك؟

أعلم أنه يمكنني القيام بـ tableView.separatorStyle = UITableViewCellStyle.None لكن ذلك سيؤثر الكل خلايا الجدول. أريد أن يؤثر فقط على آخر خلية لي.

214
Safari

في viewDidLoad ، أضف هذا السطر:

self.tableView.separatorColor = [UIColor clearColor];

وفي cellForRowAtIndexPath:

لأنظمة iOS أقل

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

بالنسبة للإصدارات iOS 7 العليا (بما في ذلك iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
332
Hiren

يمكنك استخدام الكود التالي:

سويفت:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

أو:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

للهامش الافتراضي:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

لإظهار فاصل نهاية إلى نهاية

cell.separatorInset = .zero

ج موضوعية:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
213
Avinash

لمتابعة Hiren إجابة.

في ViewDidLoad والسطر التالي:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

أو ، إذا كنت تستخدم XIB's أو تغيير القصص المصورة " فاصل " إلى " لا شيء ":

Interface builder

وفي CellForRowAtIndexPath أضف هذا:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

فيما يلي مثال للنتيجة التي قمت فيها بعرض عرض جدول مع خلايا ديناميكية (لكن لدي واحدة فقط تحتوي على محتويات). والنتيجة هي أن ذلك الشخص فقط لديه فاصل وليس كل ما يضيفه الجدول "الوهمي" تلقائيًا يضيف إلى ملء الشاشة.

enter image description here

أتمنى أن يساعدك هذا.

تحرير: بالنسبة لأولئك الذين لا يقرؤون التعليقات دائمًا ، هناك بالفعل طريقة أفضل للقيام بذلك مع بضعة أسطر من التعليمات البرمجية:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
85
Benjamin

إذا كنت لا ترغب في رسم الفاصل بنفسك ، فاستخدم هذا:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

واجهة برمجة التطبيقات هذه متوفرة فقط بدءًا من iOS 7.

50
Kemenaran

بيئة تطوير بلدي هو

  • Xcode 7.0
  • 7A220 سويفت 2.0
  • دائرة الرقابة الداخلية 9.0

الإجابات أعلاه لا تعمل بشكل كامل بالنسبة لي

بعد المحاولة ، حل عملي الأخير هو:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

والتأثير هو:  enter image description here 

29
crifan

في Swift 3 و Swift 4 ، يمكنك كتابة امتداد إلى UITableViewCell مثل هذا:

extension UITableViewCell {

  func hideSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: self.bounds.size.width, bottom: 0, right: 0)
  }

  func showSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  }
}

ثم يمكنك استخدام هذا على النحو التالي (عندما تكون الخلية هي نسخة خليتك):

cell.hideSeparator()
cell.showSeparator()

من الأفضل حقًا تحديد عرض خلية عرض الجدول على هيئة أقحم يسرى بدلاً من تعيين رقم عشوائي لها. لأنه في بعض أبعاد الشاشة ، ربما ليس الآن ولكن في المستقبل قد تظل فواصلك مرئية لأن هذا العدد العشوائي قد لا يكون كافياً. أيضًا ، في iPad في الوضع الأفقي ، لا يمكنك ضمان أن تكون فواصلك غير مرئية دائمًا.

9
pandaren codemaster

حل أفضل لنظام التشغيل iOS 7 و 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

إذا كان التطبيق قابلاً للتدوير - فاستخدم 3000.0f للثبات الداخلي الثابت أو احسبه سريعًا. إذا حاولت تعيين أقحم اليمين ، فسيكون لديك جزء مرئي من الفاصل على الجانب الأيسر من الخلية على iOS 8.

8
Sound Blaster

في iOS 7 ، يبدو فاصل خلية النمط المجمّع UITableView مختلفًا بعض الشيء. يبدو قليلا مثل هذا:

enter image description here

حاولت Kemenaran الإجابة للقيام بذلك:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

ومع ذلك لا يبدو أن العمل بالنسبة لي. لست متأكدا لماذا. لذلك قررت استخدام Hiren answer ، لكن باستخدام UIView بدلاً من UIImageView ، وارسم الخط في نمط iOS 7:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

إذا كنت تستخدم هذا ، فتأكد من توصيل ارتفاع عرض الجدول الصحيح بالبيان الثاني. آمل أن يكون هذا مفيدًا لشخص ما.

7
Enrico Susatyo

في الفئة الفرعية لـ UITableViewCell ، تخطى layoutSubviews وإخفاء _UITableViewCellSeparatorView. يعمل تحت دائرة الرقابة الداخلية 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
6
Tualatrix Chou

استخدم هذه الفئة الفرعية ، وتعيين separatorInset لا يعمل مع نظام التشغيل iOS 9.2.1 ، فسيتم ضغط المحتوى.

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://Gist.github.com/liruqi/9a5add4669e8d9cd3ee9

4
liruqi

لا أعتقد أن هذا النهج سيعمل تحت أي ظرف من الظروف مع الخلايا الديناميكية ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

لا يهم طريقة عرض الجدول التي تقوم بها للخلايا الديناميكية ، فالخلية التي قمت بتغيير الخاصية المدرجة عليها ستظل دائمًا تحتوي على خاصية الإدخال الداخلي الآن في كل مرة يتم إلغاء تثبيتها مما يؤدي إلى هياج فواصل الأسطر المفقودة ... هذا حتى غيره بنفسك.

شيء من هذا القبيل عملت بالنسبة لي:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

وبهذه الطريقة تقوم بتحديث حالة بنية بياناتك عند كل حمل

4
Greg Price

أكثر بساطة ومنطقية للقيام بذلك:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

في معظم الحالات ، لا تريد أن ترى فقط فاصل tableCiewCell الأخير. وهذا النهج يزيل فقط فاصل جدول ViewCell الأخير ، ولن تحتاج إلى التفكير في مشكلات autolayout (أي جهاز التدوير) أو قيم hardcode لإعداد إضافات الفواصل.

4
rostislawk

في سويفت باستخدام دائرة الرقابة الداخلية 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

ملاحظة: ستعمل هذه المقتطف أعلاه على UITableView باستخدام الخلايا الديناميكية. المشكلة الوحيدة التي يمكنك مواجهتها هي عند استخدام خلايا ثابتة ذات فئات ونوع فاصل مختلف عن لا شيء ونمط مجمّع لعرض الجدول. في الواقع ، في هذه الحالة بالذات ، لن تخفي الخلية الأخيرة من كل فئة. للتغلب على ذلك ، كان الحل الذي وجدته هو تعيين فاصل الخلية (من خلال IB) إلى لا شيء ، ثم إنشاء طريقة عرض خطك وإضافتها يدويًا (من خلال الرمز) إلى كل خلية. على سبيل المثال ، يرجى التحقق من المقتطف أدناه:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}
4
King-Wizard

باستخدام Swift 3 واعتماد أسرع طريقة للتطفل ، يمكنك تحسين الكود باستخدام الامتدادات :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

ثم ، عند تكوين الخلية:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}
3
Luca Davanzo

اضبط separatorInset.right = .greatestFiniteMagnitude على خليتك.

3
Matthew Korporaal

إذا لم تنجح الإجابة المقبولة ، يمكنك تجربة هذا:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

انه لشيء رائع ؛)

2
debiasej

سويفت:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

ج موضوعية:

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

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}
2
RyuX51

في willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
2
Kimate Richards
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
2
Gank

لـ Swift 2:

أضف السطر التالي إلى viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
1
Sebastian
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}
1
Adobels

لا يمكنني إخفاء الفاصل في خلية معينة باستثناء استخدام الحل التالي

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
1
Mahmoud Adam
cell.separatorInset = UIEdgeInsetsMake(0.0, cell.bounds.size.width, 0.0, -cell.bounds.size.width)

يعمل بشكل جيد في نظام التشغيل iOS 10.2

 enter image description here 

1
katwal-Dipak

عليك أن تأخذ خلية مخصصة وإضافة تسمية وتعيين قيود مثل يجب أن تغطي منطقة الخلية بأكملها. واكتب السطر أدناه في المنشئ.

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

أيضا تعيين هامش تخطيط UITableView على النحو التالي

tblSignup.layoutMargins = UIEdgeInsetsZero;
1
Coder_A_D

جرب الكود أدناه ، قد تساعدك في حل مشكلتك

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

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}
1
Nakkeeran

متطلباتي هو إخفاء الفاصل بين الخلية الرابعة والخامسة. لقد حققت ذلك من قبل

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}
1
SMS

أفضل طريقة لتحقيق ذلك هي إيقاف تشغيل فواصل الأسطر الافتراضية ، والفئة الفرعية UITableViewCell وإضافة فاصل خط مخصص بمثابة عرض فرعي لـ contentView - انظر أدناه خلية مخصصة تستخدم لتقديم كائن من النوع SNStock يحتوي على خواص سلسلة ، ticker و name:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

لتعطيل استخدام فاصل الخط الافتراضي ، tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. جانب المستهلك بسيط نسبيًا ، انظر المثال أدناه:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}
1
Zorayr

بالنسبة لنظام iOS7 والإصدارات الأحدث ، فإن الطريقة الأنظف هي استخدام INFINITY بدلاً من القيمة المضغوطة. لا داعي للقلق بشأن تحديث الخلية عند تدوير الشاشة.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
1
Xchord

كما أشار (كثير) آخرون ، يمكنك بسهولة إخفاء الكل UITableViewCell فواصل ببساطة عن طريق إيقاف تشغيلهم لكامل UITableView نفسه ؛ على سبيل المثال في UITableViewController الخاص بك

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

لسوء الحظ ، من PITA حقيقي القيام به على لكل خلية على أساس ، وهذا ما كنت حقا تسأل.

شخصيا ، لقد جربت العديد من التباديل لتغيير cell.separatorInset.left ، مرة أخرى ، كما اقترح (كثير) آخرون ، ولكن المشكلة هي اقتباس Apple (تم إضافة التأكيد):

" ... يمكنك استخدام هذه الخاصية لإضافة مسافة بين محتويات الخلية الحالية والحواف اليمنى واليسرى من الجدول. القيم الداخلية الإيجابية الموجبة تتحرك محتوى الخلية وفاصل الخلية إلى الداخل و بعيدًا عن حواف الجدول ... "

لذلك ، إذا حاولت "إخفاء" الفاصل عن طريق دفعه خارج الشاشة إلى اليمين ، فيمكنك أيضًا وضع مسافة بادئة أيضًا في عرض محتوى الخلية الخاصة بك. كما اقترح crifan ، يمكنك عندئذ محاولة التعويض عن هذا التأثير الجانبي السيئ عن طريق ضبط cell.indentationWidth و cell.indentationLevel بشكل مناسب لنقل كل شيء إلى الوراء ، لكنني وجدت أن هذا لا يمكن الاعتماد عليه أيضًا (المحتوى لا يزال يتم وضع مسافة بادئة ...).

الطريقة الأكثر موثوقية التي وجدتها هي الإفراط في ركوب layoutSubviews في فئة فرعية UITableViewCell بسيطة وتعيين يمين أقحم بحيث يصل إلى الجانب الأيسر ، مما يجعل الفاصل ذو عرض 0 وغير مرئي [هذه الاحتياجات يجب القيام به في layoutSubviews للتعامل مع التناوب تلقائيًا]. أود أيضًا إضافة طريقة ملائمة إلى فئتي الفرعية لتشغيل هذا.

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

تحذير: لا توجد طريقة يمكن الاعتماد عليها لاستعادة الأصل اليمين ، لذا لا يمكنك 'إلغاء إخفاء' الفاصل ، وبالتالي لماذا أستخدم طريقة hideSeparator لا يمكن الرجوع عنها (مقابل فضح separatorIsHidden). يرجى ملاحظة أن فاصل الفاصل يستمر عبر الخلايا المعاد استخدامها ، لأنه لا يمكنك 'إلغاء إخفاء' ، تحتاج إلى الحفاظ على هذه الخلايا الفاصل المخفي معزولة في reuseIdentifier الخاصة بهم.

0
tiritea

يكون الأمر مفيدًا لي عندما أستخدم الإضافة والاتصال ضمن layoutSubviews () لتحديث طرق عرض التخطيط على الفور.

extension UITableViewCell {

    func removeSeparator() {
        separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
    }
}

override func layoutSubviews() {
    super.layoutSubviews()

    removeSeparator()
}
0
Top

الشفرة التي تحتوي عليها كل الإجابات ستجعل الخلايا الوسادة تساوي الصفر بدلاً من القيمة الافتراضية. رأيت المشكلة في iOS 11 iPad Pro 12 ''

لكن لدي حل واحد ("الاختراق القذر") وهو إنشاء قسم فارغ من شأنه أن يجعل خط الفاصل للاختباء.

هنا هو الرمز الذي استخدمته:

typedef enum PXSettingsTableSections {
    PXSettingSectionInvite = 0,
    PXSettingSectionAccount,
    PXSettingSectionPrivacy,
    PXSettingSectionCreation,
    PXSettingSectionTest,
    PXSettingSectionAboutHide,  // invisble section just to hide separator Line
    PXSettingSectionFooterHide, // invisble section just to hide separator Line
    PXSettingSectionNumItems,
} PXSettingsTableSectionsType;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return PXSettingSectionNumItems;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case PXSettingSectionInvite: return 1;
        case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
        case PXSettingSectionPrivacy: return 1;
        case PXSettingSectionCreation: return 2;
        case PXSettingSectionTest: return 3;
        case PXSettingSectionAboutHide: return 3;
        default: return 0;
    }
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    switch(section)
    {
        case PXSettingSectionInvite: return nil;
        case PXSettingSectionAccount: return @"Account";
        case PXSettingSectionPrivacy: return @"Privacy";
        case PXSettingSectionCreation: return @"Someting";
        case PXSettingSectionTest: return @"Test";
        case PXSettingSectionAboutHide: return @" ";
        case PXSettingSectionFooterHide: return @" ";
    }
    return nil;
}


- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {

    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
        // [UIColor clearColor] will not work 
        [header.contentView setBackgroundColor:[UIColor whiteColor]];
    }
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    // You can control here the size of one specific section
    if(section == PXSettingSectionAboutHide){
        return 0.0000001; //make it real small
    }
    return 45.0;
}


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

    switch(indexPath.section)
    {
        case PXSettingSectionInvite:
            return self.inviteCell;
        case PXSettingSectionAccount:
            if (isSocialLogin) {
                return self.myWalletCell;
            }
            switch(indexPath.row)
            {
                case 0: return self.changePasswordCell;
                case 1: return self.myWalletCell;
            }
        case PXSettingSectionPrivacy:
            switch(indexPath.row)
        {
            case 0: return self.privateAccountCell;
        }
        case PXSettingSectionCreation:
            switch(indexPath.row)
        {
            case 0: return self.videoResolutionCell;
            case 1: return self.selfieMirrorCell;
        }
        case PXSettingSectionTest:
            switch(indexPath.row)
        {
            case 0: return self.termsOfUseImageCell;
            case 1: return self.attributionCell;
            case 2: return self.aboutCell;
        }
        case PXSettingSectionAboutHide:{
            switch(indexPath.row)
            {
                case 0: return self.clearCacheCell;
                case 1: return self.feedbackCell;
                case 2: return self.logoutCell;
            }
        }
    }

    return self.emptyCell;
}
0
Tiago Mendes

داخل فئة خلية tableview. ضع خط الكود هذا

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
0
M.Nadeeshan

في نظام iOS9 ، واجهت مشكلة في أن تغيير إدراجات الفاصل يؤثر أيضًا في تحديد موضع النص و detailsLabel.

أنا حلها مع هذا

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
0
Saren Inden