UITableView에서 구분 기호의 전체 너비를 설정하는 방법


149

나는이 UITableView분리기는 전체 폭이없는 곳입니다. 왼쪽보다 10 픽셀 정도 끝납니다. 에서이 코드를 가지고 놀았습니다 viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

또한 스토리 보드에서 사용자 정의 또는 기본 선택기를 선택할 수 있습니다. 이제 채워진 모든 셀에는 전각 선택기가 없지만 비어있는 셀에는 전폭이 있습니다.

이 문제를 어떻게 해결할 수 있습니까?


9
UITableView속성이 separatorInset있습니다. UITableView줄 구분 기호 의 삽입 을 0으로 설정하십시오 . 또한 당신은을 변경할 수 있습니다 separatorInset스토리 보드에서
KRUKUSA

답변:


220

이것은 Xcode 6.4 및 Swift 1.2를 사용하는 iOS 8.4-9.0 장치에서 저에게 효과적이었습니다.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

스위프트 5 업데이트 :

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

왜 이렇게하면 빈 테이블이있는 테이블이 제거됩니까? 분리기는 옮겨졌지만 버튼이 보이지 않습니다.
Oscar

1
@ 제임스 "빈 테이블로 테이블을 제거 하시겠습니까?" 버튼을 어떻게 추가 했습니까 (IB, 코드를 통해)?
MB_iOSDeveloper

1
아주 좋은 해결책. 그러나 필자의 경우 셀 초기화에 코드를 똑바로 넣었습니다. 왜냐하면 모든 컨트롤러에서 전체 너비의 구분 기호를 원했기 때문입니다.
Vojta

확실하지 않은 경우, 이것은 물론 적절한 구문 변경과 함께 Objective-C에서도 작동합니다.
cohenadair

1
이 솔루션 중 어느 것도 iPad에서 작동하지 않습니다. 이것은 iPhone에서만 작동합니다.
Charles Robertson

103

이 게시물에서 답을 얻었습니다 : iOS 8 UITableView separator inset 0 not working

이 코드를 UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

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

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

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

2
그것은 단지있는 tableView 위임 방법을 추가하는 나를 위해 작동
TonyTony

미안해 내가 미쳤어 TableViewDeleagte?를 추가하기에 충분했음을 의미합니다. 나는 단지 그것이 나를 위해 작동하지 않는다고 덧붙였다. @TonyTony
Timo Cengiz

3
나를 위해 방법 viewDidLayoutSubviews이 필요하지 않습니다
TonyTony

8 이외의 다른 IOS 버전으로 코드를 실행하려고 했습니까? 어쩌면 최신 버전에서 작동 할 수도 있습니다. 그렇지 않으면 작동한다는 것이 좋습니다. tableview delegate 메소드를 추가하려고 시도했지만 도움이되지 않았습니다. @TonyTony
Timo Cengiz

나는 둘 다 사용해야했다. 나는 성공하지 않고 각각을 개별적으로 사용해 보았습니다. 둘 다 사용할 때만 작동했습니다. 또한 뷰 컨트롤러가 UITableViewController의 하위 클래스 일 때와 UIViewController의 하위 클래스 일 때 시도했습니다. 차이 없음. 8.1 시뮬레이터에서 실행 중입니다.
Ron

100

당신의 UITableViewCell

Interface Builder에서 Attributes Inspector로 이동하여 간단히 "15"를 0으로 변경하십시오. 변경하려는 모든 셀에 대해이를 수행하십시오.

실습

당신은에 추가해야 할 수도 [cell setLayoutMargins:UIEdgeInsetsZero];있습니다tableViewCell


1
아니면 이상하다. 이것은 UITableViewCells가 표시되는 행에서 나에게 도움이되었지만 (감사합니다!), 그 아래 빈 행에는 구분 기호가 여전히 15 픽셀만큼 들여 쓰기되었습니다.
Mike Gledhill

정적 셀을 사용하는 경우 이미지에 설명 된대로 왼쪽 삽입을 0으로 변경하기 만하면됩니다 (iOS 10에서 작업, Xcode 8.3.1)
Ignacio Valdivieso

29

스위프트 3 :

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. 당신의 선택 UITableViewCell
  2. Atributes Inspector로 이동
  3. 분리기로 이동하여 "사용자 정의 삽입"으로 변경하십시오.
  4. 설정 left및 / 또는 right필드. (기본적 left: 15으로 right: 0)

작동 방식보기 (을 사용하여 left: 100) :

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

결과:

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


1
@Hannah 루이 카니에서 이전 대답의 중복
콘스탄틴 Salavatov에게

19

나는 UITableViewController두 개의 삽입 설정을 상속 하고 추가 로 false willDisplayCell를 설정 preservesSuperviewLayoutMargins해야했습니다. 스위프트에서는 다음과 같이 보입니다 :

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

당신은 설정할 필요가 없습니다 preservesSuperviewLayoutMargins = false디폴트 값이 false 이미 있기 때문에
crubio가

2
셀이 전체 높이를 구성하지 않으면 컨트롤러가 표시하는 '자리 표시 자'셀의 구분 기호가 셀 아래의 뷰를 채우도록 조정되지 않습니다.
Tieme

11

구분 기호 Inset는 기본적으로 왼쪽에서 15입니다. 구분 기호 Inset옵션을에서 auto로 변경 custom하고 삽입을로 설정하십시오 0.

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


9

iOS 9 이상에서 Swift

사용자 정의를 사용하는 경우 UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

다음에 UITableView에서 viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

이것은 나를 위해 고친 유일한 대답입니다 (swift 3으로 업데이트 됨). 그러나 ... 셀에 데이터가있을 때 작동합니다. 아직 채워지지 않은 빈 셀의 경우 (이 재정의 layoutMargins 변수를 호출하지 않은 것 같음) 구분 기호는 여전히 테이블 뷰에서 사용자 정의 셀의 전체 너비를 채우지 않습니다. 그것에 대한 아이디어가 있습니까?
RanLearns 1

iPhone에서 구분 기호는 빈 셀에서 왼쪽에서 몇 픽셀, 오른쪽에서 몇 픽셀에서 끝납니다. 이 트릭을 사용하여 여백을 제로화하지 않고도 괜찮아 보입니다. iPad에는 실제 문제가 있습니다. 빈 셀의 구분 기호는 테이블 너비의 왼쪽 가장자리에서 벗어나고 셀 너비의 약 80 %입니다. 셀에 데이터가있을 때 구분 기호는 여전히 셀 너비의 80 %이지만 시작 부분의 20 %에서 시작하여
테이블 뷰

1
해결 방법 ... if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} 사용하여 iPhone에서 코드가 전혀 필요하지 않습니다. 구분 기호는 전체 너비로 이동합니다. iPad에서 빈 셀에는 전체 너비 구분 기호가 있지만 데이터가 추가 될 때 전체 너비를 유지하려면 코드가 필요합니다. 그렇지 않으면 데이터가 셀을 채우면 구분 기호가없는 왼쪽에 몇 픽셀이 추가됩니다.
RanLearns

1
위의 주석에서 코드를 얻은 위치 : stackoverflow.com/a/31538250/428981
RanLearns

9

iPad에 문제가있는 사용자의 경우 iPhone과 동일한 상태가됩니다. 그런 다음 separatorInset필요에 따라 조정할 수 있습니다 .

tableView.cellLayoutMarginsFollowReadableWidth = false

이것은 iOS 10 대 iOS 11에서 내 문제였습니다. iOS 11은 괜찮 았지만 10은 여백이 다릅니다. 감사!!!
migs647

9

cellForRowAtIndexPath방법으로 사용하여 셀 구분 기호 사양을 구성
하면 iOS9.0 이상에서 완벽하게 작동합니다.

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

iOS 9.3 및 Swift 2.2에서 테스트되었습니다. willDisplayCell셀을 표시하기 직전에 호출되는 코드를 넣고 셀 cellForRowAtIndexPath을 만드는 위치에만 넣지 마십시오 .

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

override에 대한 함수에 다음 UITableViewController과 같이 추가하십시오 .

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

위의 어느 것도 Swift 2.2 및 Xcode 7.3.1에서 나를 위해 일하지 않았습니다.

가장 간단한 해결책으로 판명되었습니다. 코드가 필요하지 않습니다. 인스펙터 TableViewCell에서 Layout Margins 값을 변경 하십시오 UITableView.


4

스위프트 3의 경우 :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

viewDidLoad (테스트 된 iOS11-swift 4.1)

시험

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

이 솔루션 중 어느 것도 iPad에서 작동하지 않지만 두 장치를 모두 다루는 솔루션을 생각해 냈습니다.

재사용 가능한 셀 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

재사용 할 수없는 셀의 경우 :

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

이 접근법을 확장하려면 다음을 수행하십시오.

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

UITableView& 는 두 속성을 모두 사용할 수 있습니다 UITableViewCell. 후자는 사실의 속성 UIView이며의 부모 클래스 인 UITableView& 의 속성입니다 UITableViewCell.


1
재사용 할 수없는 셀에 대해 발견 한 유일한 실행 가능한 솔루션
Mickey

0

스위프트 5, Xcode 11 업데이트

이것을 viewDidLoad () 안에 넣으십시오.

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

가장자리 대 가장자리 구분 기호의 경우 왼쪽과 오른쪽의 값을 0으로 설정하십시오.

그런데 "yourTableView"를 tableView Outlet 이름으로 변경하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.