하나의 UITableViewCell에서 구분선 숨기기


250

를 사용자 정의하고 UITableView있습니다. 마지막 셀 에서 구분되는 줄을 숨기고 싶습니다 ...이 작업을 수행 할 수 있습니까?

나는 할 수 tableView.separatorStyle = UITableViewCellStyle.None있지만 tableView의 모든 셀에 영향을 줄 것임을 알고 있습니다 . 나는 그것이 나의 마지막 세포에만 영향을 미치기를 원합니다.



귀하의 질문에 대한 답변이 있습니다. tableView.separatorStyle = UITableViewCellStyle.None은 내가 필요로하는 라인
Malachi Holden

답변:


371

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);
}

4
이것은 iOS7 및 iOS8에서 작동합니다. 분리기를 0으로 효과적으로 압착합니다. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris

9
알림 : iDevice가 iPad이고 셀이 자동 레이아웃으로 사용되는 경우 "cell.bounds.size.width"에 의해 반환되는 값은 실제 셀 너비와 같지 않을 수 있습니다. 따라서 항상 "cell.bounds.size.width"대신 "tableView.frame.size.width"를 사용합니다.
Veight Zhou

5
참고 : [cell.contentView addSubview:line]대신 사용하십시오[cell addSubview:line]
Anastasia

6
cell.separatorInset 왼쪽 삽입을 변경하면 셀 내용의 왼쪽 삽입도 변경됩니다. 구분선 만이 아닙니다. apple doc에서 : "이 속성을 사용하여 현재 셀의 내용과 테이블의 왼쪽과 오른쪽 가장자리 사이에 공간을 추가 할 수 있습니다. 양의 삽입 값은 셀 내용과 셀 구분 기호를 테이블 가장자리에서 안쪽으로 이동시킵니다."
zgjie

9
나쁜 생각. 의 셀에 하위 뷰를 추가해서는 안됩니다 cellForRowAtIndexPath. 세포는 재사용된다는 것을 기억하십시오. 이 셀을 재사용 할 때마다 다른 구분선보기가 추가됩니다. 큰 목록에서는 스크롤 성능에 영향을 줄 수 있습니다. 그리고 그것은 그것을하는 올바른 방법이 아닙니다.
Dave Batton

247

다음 코드를 사용할 수 있습니다 :

빠른 :

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

목표 -C :

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

UITableView허용 된 답변은 있지만 그룹에는 작동 하지 않습니다.
Aleks N.

3
iOS9에서는 작동하지 않습니다 self.tableView.separatorColor = [UIColor clearColor];.
Ben

1
완전한 해킹이지만 iOS 9에서 작동하는 것은 다음과 같습니다. cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer

이것이 iOS 8 이상에서 작동하는 방식입니다 cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);. cell.layoutMargins.left 값을 빼지 않으면 구분선이 왼쪽 테두리에서 왼쪽 여백 (있는 경우)으로 그려집니다.
Alexandre OS

3
textLabel화면 밖으로 밀어냅니다 .
aehlke

99

Hiren 의 답변에 대한 후속 조치 .

viewDidLoad에 다음과 같은 라인 :

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

또는 XIB 또는 스토리 보드를 사용하는 경우 " separator "를 " none "으로 변경하십시오.

인터페이스 빌더

그리고 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];

다음은 동적 셀이있는 테이블 뷰를 표시하는 결과의 예입니다 (하지만 내용이있는 단일 뷰 만 있음). 그 결과 하나에 만 분리자가 있고 모든 "더미"테이블 뷰가 자동으로 추가되어 화면을 채우지 않습니다.

여기에 이미지 설명을 입력하십시오

도움이 되었기를 바랍니다.

편집 : 항상 주석을 읽지 않는 사람들에게는 실제로 몇 줄의 코드로 주석을 처리하는 더 좋은 방법이 있습니다.

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

구분선을 숨기려면 이것이 올바른 접근법이라고 생각합니다. self.tableView.separatorStyle = .none
arango_86

52

구분 기호를 직접 그리지 않으려면 다음을 사용하십시오.

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

이 API는 iOS 7부터 사용할 수 있습니다.


8
separatorInset셀 내용과 분리막을 삽입하는 것으로 보이며 또 다른 해킹이 필요합니다.cell.IndentationWidth = -10000;
crishoj

23
더 좋은 방법은 separatorInset상단, 왼쪽 및 하단에 0 으로 설정 하고 오른쪽에 셀 너비를 설정하는 것입니다. cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); 이렇게하면 다른 셀 속성을 조정할 필요가 없습니다.
bryguy1300

삽입물에 셀 경계 너비를 사용하는 경우 인터페이스가 회전 할 때 다시 계산해야 할 수 있습니다.
AndrewR

구분자를 숨기지 않을 다른 셀을 그리는 데 재사용하기 위해이 작업을 수행하는 셀은 구분 기호도 사라집니다.
Michael Peterson

1
UIEdgeInsetsMake (0, 10000, 0, 0); 작동-> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); 하지 않았다. 내가 xib와 styoryboard에 3.5 "크기의 vc를 유지하는 불쾌한 습관이 있기 때문에 4"+ 장치의 아티팩트는 375-320px 섹션 = 55px 남아 있습니다. (요다의 목소리로) 매우 추악합니다!
Anton Tropashko

29

내 개발 환경은

  • Xcode 7.0
  • 7A220 스위프트 2.0
  • iOS 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

효과는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오


20

separatorInset.right = .greatestFiniteMagnitude당신의 세포에 설정 하십시오.


이것을 awakeFromNibapplicationDidBecomeActive
켜면

이것은 프로그래밍 방식의 UITableViewCell 생성에서 장치의 iOS 12.2에서 작동합니다. 좋은.
Womble

cellForRowAt에서 설정 할 때 올바른 구분 기호를 설정하면 나에게 도움이되었습니다. 최고의 솔루션. iOS 10에서 13까지 작동합니다. 왼쪽 여백가 설정되면이 아이폰 OS (10)에 대해 작동하지 않습니다 (12) 및 (13) 아이폰 OS 10에서 테스트
아리엘 Bogdziewicz

18

에서 스위프트 3, 스위프트 4 스위프트 (5)는 ,이 같이있는 UITableViewCell의 확장을 작성할 수 있습니다 :

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

그런 다음 아래와 같이 사용할 수 있습니다 (셀이 셀 인스턴스 인 경우).

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

테이블 뷰 셀의 너비를 임의의 숫자를 할당하는 대신 왼쪽 삽입으로 할당하는 것이 좋습니다. 일부 화면 크기에서는 현재는 아니지만 나중에는 임의의 숫자로는 충분하지 않기 때문에 구분 기호를 계속 볼 수 있습니다. 또한 가로 모드의 iPad에서는 구분 기호가 항상 보이지 않도록 보장 할 수 없습니다.


그룹 스타일 UITableView에는 작동하지 않습니다. 그룹화 된 사례에 대한 솔루션이 있습니까?
zslavman

8

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의 셀 왼쪽에 구분 기호가 표시됩니다.


1
다음과 같이 할 수있을 때 난수를 사용하는 이유는 다음과 같습니다. MAX ([[UIScreen mainScreen] bounds] .size.width, [[UIScreen mainScreen] bounds] .size.height); 항상 사라지도록
Daniel Galasko

7

iOS 7에서 UITableView 그룹화 스타일 셀 구분 기호는 약간 다르게 보입니다. 다음과 같이 보입니다.

여기에 이미지 설명을 입력하십시오

나는 이것을하는 Kemenaran의 대답 을 시도했다 .

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

그러나 그것은 나를 위해 작동하지 않는 것 같습니다. 왜 그런지 잘 모르겠습니다. 그래서 Hiren의 답변 을 사용하기로 결정 했지만 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];
}

이를 사용하는 경우 두 번째 if 문에 올바른 테이블 뷰 높이를 연결하십시오. 나는 이것이 누군가에게 유용하기를 바랍니다.


7

UITableViewCell 서브 클래스에서 layoutSubviews를 대체하고 _UITableViewCellSeparatorView를 숨기십시오. iOS 10에서 작동합니다.

override func layoutSubviews() {
    super.layoutSubviews()

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

위 솔루션 중 어느 것도 12 IOS에 ,,이 작품을 일하지
압둘 와히드

개인 API에 액세스하기 위해 App Store에서 거부 될 수 있습니다.
Elliot Fiske

5

나는이 접근법이 역동적 인 셀이있는 상황에서 작동하지 않을 것이라고 생각합니다 ...

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)
}

그렇게하면 모든로드에서 ur 데이터 구조 상태를 업데이트 할 수 있습니다


4

에서 스위프트 사용하여 아이폰 OS 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를 통해)를 none으로 설정 한 다음 코드를 통해 수동으로 선보기를 작성하여 각 셀에 추가하는 것입니다. 예를 들어 아래의 스 니펫을 확인하십시오.

/*
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)
    }
}

내 프로젝트에서 이것은 정적 셀에서는 작동하지만 동적 셀에서는 작동하지 않습니다. 후자의 경우 마지막 셀의 내용이 오른쪽으로 이동합니다 (분리선과 동일). 어떤 아이디어, 왜 이런 일이 일어날 수 있습니까?
Bastian

위 답변의 첫 번째 스 니펫은 동적 셀을 사용하여 UITableView에서 작동합니다. 발생할 수있는 유일한 문제는 범주, 정적 유형이없는 구분자 및 테이블보기에 대해 그룹화 된 스타일이있는 정적 셀을 사용할 때입니다. 실제로이 특정 경우에는 각 범주의 마지막 셀을 숨기지 않습니다. 그것을 극복하기 위해, 찾은 해결책은 셀 구분 기호 (IB를 통해)를 none으로 설정 한 다음 코드를 통해 수동으로 선보기를 작성하여 각 셀에 추가하는 것입니다. 예를 들어 위 답변의 두 번째 스 니펫을 확인하십시오.
King-Wizard

텍스트 (제목)를 이동하므로 쓸모가 없습니다!
user155

4

이 하위 클래스를 사용하면 세트 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

훨씬 간단하고 논리적 인 방법은 다음과 같습니다.

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

대부분의 경우 마지막 tableCiewCell 구분 기호 만보고 싶지 않습니다. 그리고이 방법은 마지막 tableViewCell 구분 기호 만 제거하므로 구분 기호 삽입을 설정하기 위해 자동 레이아웃 문제 (예 : 회전 장치) 나 하드 코드 값을 생각할 필요가 없습니다.


1
스택 오버플로에 오신 것을 환영합니다! 미래 독자들을위한 더 나은 대답은 왜 이것이 더 단순하고 더 논리적인지를 설명 할 것입니다.
CGritton

좋은 해결책!
geek1706


3

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
    }
}

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

이것을 달성하는 가장 좋은 방법은 기본 라인 분리, 서브 클래스를 해제하는 것입니다 UITableViewCell와의 하위 뷰 같은 사용자 정의 행 분리를 추가 contentView- 유형의 객체 제시하는 데 사용되는 사용자 정의 셀 아래 참조 SNStock두 개의 문자열 속성을 가지고, tickername:

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!
}

2

스위프트 2의 경우 :

다음 줄을 추가하십시오 viewDidLoad().

tableView.separatorColor = UIColor.clearColor()

2

허용 된 답변이 효과가 없으면 다음을 시도해보십시오.

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

대단하다;)


1

아래 코드를 사용하여 문제를 해결하는 데 도움이 될 수 있습니다

- (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
- (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

사용자 정의 셀을 가져 와서 레이블을 추가하고 레이블과 같은 제약 조건을 설정하여 전체 셀 영역을 포함해야합니다. 생성자에 아래 줄을 작성하십시오.

- (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

다음 해결 방법을 사용하지 않고 특정 셀에서 구분 기호를 숨길 수 없습니다

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}

1

iOS7 이상에서는 하드 코딩 된 값 대신 INFINITY를 사용하는 것이 더 깔끔합니다. 화면이 회전 할 때 셀 업데이트에 대해 걱정할 필요가 없습니다.

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

3
경고 : INFINITY를 사용하면 iOS9에서 런타임 예외가 발생합니다
AndrewR

1

다른 사람들이 지적했듯이 모든 UITableViewCell 구분 기호를 전체 UITableView 자체에서 끄면 쉽게 숨길 수 있습니다 . 예를 들어 UITableViewController에서

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

불행히도, 셀 당 할 실제 PITA 단위 는 실제로 요구하는 것입니다.

개인적으로, 나는 변화를 수많은 순열을 시도했다 cell.separatorInset.left (많은) 다른 사람들이 제안한 것처럼을 다시 했지만 문제는 Apple을 인용하는 것입니다 (강조 추가).

" ...이 속성을 사용하여 현재 셀의 내용 과 표의 왼쪽과 오른쪽 가장자리 사이에 공간을 추가 할 수 있습니다 . 양의 삽입 값 은 셀 내용 과 셀 구분 기호를 표 가장자리에서 안쪽으로 이동시킵니다 . " "

따라서 구분 기호를 오른쪽으로 밀어 분리 기호를 '숨기려고'하면 셀의 contentView도 들여 쓰기 할 수 있습니다. crifan에 의해 제안으로, 당신은 설정하여이 불쾌한 부작용을 보상하기 위해 시도 할 수 cell.indentationWidthcell.indentationLevel 적절하게 이동 모든 것을 뒤로,하지만 난 (내용은 아직 들여지고 ...)이 또한 신뢰할 수없는 것으로 나타났습니다.

내가 찾은 가장 신뢰할 수있는 방법 layoutSubviews은 간단한 UITableViewCell 하위 클래스를 재정의하고 오른쪽 삽입을 설정하여 왼쪽 삽입 에 도록 설정 하여 구분 기호의 너비를 0으로 설정하여 보이지 않게 만드는 것입니다. 핸들 회전]. 또한 하위 클래스에 편의 메서드를 추가하여이 기능을 켭니다.

@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 노출). separatorInset은 재사용 된 셀에 걸쳐 지속되므로 '숨기기 해제'할 수 없으므로 이러한 숨겨진 분리기 셀을 고유 한 reuseIdentifier로 격리해야합니다.


1

내 요구 사항은 4 번째와 5 번째 셀 사이의 구분 기호를 숨기는 것이 었습니다. 나는 그것을 달성했다

    -(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

빠른:

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
}

목표 -C :

- (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;
}

1

테이블 뷰 셀 클래스 내부 이 코드 라인을 넣어

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

장치 / 장면 레이아웃 변경을 설명하지 않습니다.
Womble

0

iOS9에서 구분 기호 삽입을 변경하면 text- 및 detailLabel의 위치에 영향을 미치는 문제가있었습니다.

나는 이것을 해결했다

override func layoutSubviews() {
    super.layoutSubviews()

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

UITableViewCell 클래스와 함께 작동하지 않음-TextLabel 및 DetailedTextLabel이 셀에서 멀어집니다.
Nik Kov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.