UITableView에서 셀 앞의 빈 공간 제거


172

현재 UITableView뷰 컨트롤러 상단이 아닌 다른 위치에을 넣으려고합니다 . 이 말을하면 탐색 모음을 설명하기 위해 상단에 헤더를 추가하려고하지만 컨트롤러 상단에 없기 때문에 필요하지 않습니다.

UITableView셀을 원하는 위치 의 왼쪽 상단 모서리에 넣으면 셀이 배치되지 않습니다.

이제 테이블보기를 위로 이동하여 셀이 올바른 위치에 있으면 다른 문제가 발생합니다. 스크롤 할 때 셀이 거기까지 올라갈 수 있습니다 (이는 내 손가락으로 내비게이션 컨트롤러 위에 있음).

내가 놓았을 때, 그렇습니다-셀은 검색 창 바로 아래로 갈 것입니다. 그러나 이것은 당신이 그것을 그 위로 가져올 수있는 방법에 분명히 문제입니다.

어떻게하면 되나요? 더 쉬운 방법이 있습니까?

답변:


378

UITableView아래로 스크롤 할 때 빈 칸에 쇼 의 셀이 있습니까?

그렇다면 문제는 UITableView보기에있는 내비게이션 컨트롤러로 인해 추가 된 삽입물 일 수 있습니다. 스크롤이 발생하지 않은 경우 탐색 모음 아래에 컨텐츠를 배치하기 위해 삽입 된 내용이 테이블보기에 추가됩니다. 표를 스크롤하면 내용이 스크롤되어 투명한 탐색 막대 아래에 표시됩니다. 이 동작은 물론 테이블보기가 탐색 표시 줄에서 직접 시작하는 경우에만 필요합니다. 여기에는 해당되지 않습니다.

주목해야 할 또 다른 사항은 iOS가보기 계층 구조의 첫 번째보기 UIScrollView또는 하위 항목 (예 : UITableViewUICollectionView) 인 경우에만 콘텐츠 삽입을 조정한다는 것입니다 . 뷰 계층 구조에 여러 개의 스크롤 뷰가 포함 된 automaticallyAdjustsScrollViewInsets경우 첫 번째 스크롤 뷰만 조정합니다.

이 동작을 변경하는 방법은 다음과 같습니다.

a) 인터페이스 빌더

  • 뷰 컨트롤러를 선택하십시오
  • 개방형 속성 관리자
  • IB의 속성 관리자 (보기 컨트롤러가 선택된 경우)에는 "스크롤보기 삽입 조정"이라는 속성이 있으며 기본적으로 켜져 있습니다. 이 옵션을 선택 취소하십시오 :


    ( Dheeraj D 의 이미지 제공 )

어떤 Xcode 버전이이 옵션을 도입했는지 확실하지 않지만 (릴리스 정보에서이 옵션을 발견하지는 못했지만) 적어도 버전 5.1.1에서는 사용할 수 있습니다.

편집 : 혼란을 피하기 위해 이것은 주석에서 언급 된 세 번째 옵션이었습니다

b) 프로그래밍 방식으로

이것을 ie에 추가하십시오 viewDidLoad( Slavco Petkovski 의 답변과 Cris R 의 의견에 대한 신용 )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) 이것은 고등학생과 관련이있을 수 있습니다

추가하여이 문제를 해결할 수 있습니다

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

또는 IB를 사용하고 있고 탐색 표시 줄이 투명하지 않은 경우 (스크린 샷에서 알 수 없음)

  • 뷰 컨트롤러를 선택하십시오
  • 개방형 속성 관리자
  • View Controller 옵션 모서리 확장 섹션에서 "상단 막대 아래"를 선택 취소합니다.

2
UIView에서 "Under Top Bars"를 선택 해제하면 나에게 잘 작동했습니다. 감사.
Andreas Øverland

"Paging Enabled"를 사용하여 화를 내고 스크롤이 전체 셀 대신 탐색 막대 높이만큼만 이동합니다. 감사.
LordParsley

8
세 번째 옵션 : "스크롤보기 삽입 조정"선택 해제-참처럼 작동했습니다. 고마워요
Stas Zhukovskiy

2
"de pelos"를 작동하는 Swift에서 self.automaticallyAdjustsScrollViewInsets = false!
Cris R

1
감사합니다. UIEdgeInsetsZero는 새 테이블 컨트롤러에서 테이블을 다시 사용할 때마다 동일한 흰색 간격이 나타나고 점점 커질 때마다 테이블을 재사용하는 경우 필요합니다.
malhal

71

나는이 같은 문제가 있었고 UIView가 한 시점에 있다고 확신합니다. 전체 테이블보기를 복사하고 삭제 한 다음 다시 붙여 넣으면 문제가 해결되었습니다.


7
이건 정말 이상합니다. 이것은 문제를 해결했다. 언제 이런 일이 일어날 지 아십니까?
MiQUEL

10 월 10'13의 답변을 따르면 훨씬 쉽게 해결할 수 있다고 생각합니다.
netshark1000

같은 문제가 있었다. 그것을 제거하고 읽는 것도 저에게 효과적이었습니다.
sma

3
내가 아는 한, 스크롤 뷰 컨텐츠 삽입은 스크롤 컨트롤러가 뷰 컨트롤러 뷰 계층 구조의 첫 번째 자식 인 경우에만 자동으로 조정됩니다 (자동으로 AdjustsScrollViewInsets = YES 인 경우). 내 생각 에이 솔루션은 테이블 뷰를 복사하여 붙여 넣은 후에는 더 이상 뷰 계층의 첫 번째 뷰가 아니기 때문에 작동합니다.
lekksi

tableView가 뷰에 가장 먼저 추가 될 때 시스템은 탐색을위한 공간을 떠나야한다고 생각합니다. 내 생각에 일부 사람들은 tableView를 추가 한 다음 headerView를 추가합니다. 몇 가지 문제가 발생하면 tableView를 제거하고 다시 추가하면 헤더 뷰가 계층 구조의 첫 번째이므로 시스템이 더 이상 적응 할 필요가 없으므로 문제가 해결됩니다. 코드 만 사용하기 때문에 헤더를 먼저 수정 한 다음 테이블을 추가해야했습니다.
Lluis Gerard

40

스토리 보드에서 테이블 뷰를 선택하고 스타일이 "그룹화"대신 "일반"으로 설정되어 있는지 확인하십시오. 속성 관리자 탭에서이 설정을 찾을 수 있습니다.


.. 이것은 이상하게 나를위한 해결책이었다. 나는 방금 전체 뷰 컨트롤러를 복사하여 붙여 넣었다. 이 답변은 내 문제를 해결
daisura99

이렇게하면 문제가 해결되었지만 이제는 헤더 섹션이 다르게 동작합니다. 누군가?
Bruno Muniz

축복합니다. 당신이이 세상 어디에 있든지. 당신을 영원히 축복하십시오.
gabuchan

9

내 경우에는 뷰 계층의 UITableView 아래에 UILabel이 있습니다.

나는 그것을“앞으로”움직 였고 빈 공간이 나타났다. 왜 그런지 확실하지 않지만 tableView 아래에 아무것도 없으면 공백이 숨겨집니다.

또한 스토리 보드의 뷰 컨트롤러 관리자에서 "스크롤 뷰 삽입 조정"을 확인 / 취소 할 수 있습니다.

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


2
UITableView를 그룹화했으며 "스크롤보기 삽입 조정"의 선택을 해제했습니다.
Matt

5

위의 어느 것도 나를 도와주지 않았습니다. 그러나 이렇게 하면 도움이되었습니다 .

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

'-64'대신 탐색 막대의 높이에 따라 다른 숫자를 입력 할 수 있습니다.


4

미리 추가되어있을 수 있습니다 UIRefreshControl. 다음과 같은 코드 로이 문제가 있습니다.

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

보시다시피, 나는 self.refreshController즉시init

그러나 설정 refreshControl후 설정하면 최상위 공간이 방해가되지 않습니다.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

나는 이것이 실제 문제라고 믿을 수 없다. <= 9.3.5에서는 나에게만 문제가됩니다. 세상에서 어떻게 알아 냈습니까?
사이렌

4

iOS 11 에서이 작업을 수행하는 경우 더 이상 사용되지 않아 자동 조정 ScrollViewInsets가 작동하지 않습니다.이 게시물의 답변에 따라 다음 코드가 작동했습니다. https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

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



3

확실히 말할 수는 없지만 프로토 타입 셀이 시작되는 위치와 UITableView의 상단 사이에 여분의 UIView가 붙어있는 것처럼 보입니다. 내가 추가 한 텍스트 / 줄을 제거하면 내 이미지가 정확하게 이미지처럼 보입니다.

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


3

나는 아직도 그 여분의 공간이 맨 위에 생긴 이유를 확신하지 못하지만 UITableView를 공백으로 삭제하고 새로운 것으로 바꾸면 공간이 사라짐을 알았습니다.

실수로 UIView를 드래그해야했지만 삭제할 수 없으므로 선택할 수 없었습니다.


3

스위프트 5

tableHeaderViewtableFooterView 를 제거하십시오.

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

스토리 보드 또는 xib에서 테이블 뷰 프레임을 확인하십시오. 기본적으로 광산에는 위치 값이 있으므로 버그가 있습니다.


2

내 응용 프로그램에서도 이와 같은 문제가 발생했습니다. tableView zero의 상단 가장자리를 설정했습니다. 에 false대한 설정도 시도automaticallyAdjustsScrollViewInsets . 그러나 작동하지 않았다.

마침내 나는 해결책을 얻었습니다. 나는 이것이 올바른 방법인지 모른다. 그러나 heightForHeaderInSection위임 방법을 구현 하면 나에게 도움이되었습니다. 이 작업을 수행하려면 0이 아닌 값을 반환해야합니다 (0을 반환하면 이전과 동일한 공간이 표시됨).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

2017 년에 나를 위해 일하는 것은 단순히이 한 줄입니다.

navigationController? .navigationBar.isTranslucent = false

나는 그것이 왜 영향을 미칠지 전혀 모른다. 아마도 누군가가 설명 할 수있을 것입니다. 그러나 이것이 대부분의 사람들이 찾는 대답이라고 확신합니다.


그것은 나를 위해 그것을했다. 감사!
scurioni

2

iOS 11 이상에서는 apple이 속성 삽입을 조정하기 위해 속성을 변경했습니다. 사용 contentInsetAdjustmentBehavior및 설정 .never위의 여분의 공간을 제거하기 위해 UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

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


1

나를 위해 메뉴에서 프로토 타입 셀을 테이블보기로 드래그 할 때 문제가 발생했습니다. 그래서 나는 그것을 삭제하고 테이블보기 관리자 속성에서 프로토 타입 셀을 1로 설정했습니다.


1

프로그래밍 방식 으로이 작업을 수행하고 있으며 다른 모든 하위 뷰를 추가 한 후 addSubview (tableView)를 맨 아래로 이동하면 문제가 해결되었습니다!

왜 이것이 시뮬레이터가 아닌 장치에만 나타나는지 확실하지 않지만 적어도 간단한 해결책이 있습니다!


1

UITableView가 뷰 컨트롤러의 첫 번째 하위 뷰가 아닌 한 빈 공간이 나타나지 않습니다.

해결 방법 : 뷰 컨트롤러의 첫 번째 하위 뷰 (UITableView와 동일한 수준이지만 그 이전에)에 숨겨진 / 지우기 뷰 개체 (보기, 레이블, 단추 등)를 추가하십시오.


나는 이것을 알아 내려고 여기와 다른 게시물에서 많은 제안을 시도하는 데 많은 시간을 보냈습니다. 이것이 그것을 해결 한 것입니다. 감사합니다! 왜 그런지 설명하거나 할 수있는 문서에 대한 링크를 게시 할 수 있습니까? 나는 iOS 개발을 배우고 있으며 Android와는 다릅니다. :)
Mark

0

UIView는 테이블의 상단과 하단에 삽입 (드래그 앤 드롭) 할 수 있습니다. 속성을 투명하고 높이 1px로 설정하십시오. 이것은 셀 앞에 여분의 패딩을 제거하는 것입니다.


0

또한 tableView가 계층 구조의 마지막 뷰가 아닌이 문제가있었습니다. 내 경우에는 (위에서 서로 겹치지 않았음에도 불구하고) 위의 뷰가 있었으므로 계층 구조에서 tableView 위로 드래그하여 만들었습니다.


0

방금 이것에 대한 해결책을 찾았습니다.

tableview와 clic Editor-> Arrange-> Send to Front를 선택하십시오.

그것은 나를 위해 일했고 그것이 모두에게 도움이되기를 바랍니다.


0

제 경우에는 ContainerViewController를 사용하고 UITableViewController를 넣었습니다. ContainerViewController를 제거한 후. 문제가 사라집니다.


0

Xcode 8 버그…

Storyboard UITableView 스타일이 Plain으로 설정되어 있으면 먼저 시도하십시오.

테이블 스타일을 그룹화 한 다음 다시 일반으로 설정하십시오. 이로 인해 UITableView 헤드에서 앱의 공간이 제거되었습니다.


0

필자의 경우 컨테이너보기를 사용하고있었습니다. (Main View-> Contaner View-> UITableView)

상단의 여분의 공간은 장치 알림 표시 줄의 공간과 같습니다 (시간이 표시되는 곳, 배터리). 정말 그렇습니다. 가정이 아닙니다.

내가 한 것은 UI Builder에서 얻은 것입니다.

  • 테이블 뷰 컨트롤러를 선택하십시오.
  • 개방형 속성 관리자
  • -> 컨트롤러보기-> 레이아웃-> "원하는 전체 화면 선택"으로 이동하십시오.

0

이 코드를 사용하여 테이블이 생성되는 viewDidLoad 또는 viewDidAppear에 사용할 수 있습니다.

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

스토리 보드에서 ViewController의 확장 에지를 설정하여 underTopBar속성이 선택되지 않도록합니다.


0

같은 문제가 발생했습니다. viewDidLoad에 다음을 추가하여 해결했습니다.

self.extendedLayoutIncludesOpaqueBars = true


-2

확인

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • tableview 델리게이트 함수 cellForRowAtIndexPath를 언급하십시오 .
  • iOS 6과 7을 모두 처리 할 수 ​​있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.